할당 상태가 변경되는 객체를 만듭니다.


31

나는 이것이 Ruby에서 가능하다는 것이 매우 이상하다는 것을 알았습니다 (나는 즉시 방법을 말하지 않을 것입니다).

obj = #code redacted

print obj.state # Some value.

LValue = obj

print obj.state # Different value!

당신의 도전은 대략이 형태의 코드를 작성하는 것입니다. 객체를 생성하고 변수에 할당합니다. 이전 식별자 ( 위)를 사용하여 참조 하더라도state 객체가 새 식별자 ( LValue위)에 할당 된 후 변경되는 위와 같이 정의 된 속성 (또는 결정적, dem 등식 )이 있어야합니다.obj

강조하기 위해 편집 : state또는 동등한 항목은 dem 등원이어야하므로 값을 수정하는 접근자를 작성하거나 다른 이유로 여러 번 연속으로 호출 할 때 다른 결과를 반환하는 것은 올바른 해결책이 아닙니다. 또는 더 간단히 말하면 상태를 변경하는 것은 할당이어야합니다.

완전히 합법적 인 솔루션이없는 언어가있을 수 있지만 할당 된 모든 언어를 사용할 수 있습니다. 며칠이 지난 후에도 아무도 답변을 얻지 못하면 Ruby 답변을 게시하고 가장 많이 투표 된 답변을 지속적으로 수락합니다.


실제로 변경 하려면 LValue = obj회선이 필요 state합니까? (저는 C #에서 매번 증가하는 속성을 만들 수 있습니다)
Tim S.

2
그렇습니다.이 방법은 ent 등식이 필요하다고 말하면서 의도 한 것입니다. 더 명확하게 편집하겠습니다.
histocrat 2016 년

알았어 고마워. 나는 그 부분에 대해 글로시 했어야했다.
Tim S.

4
단순히 객체의 참조 횟수를 반환합니까?
Nick T

객체 자체가 파괴적으로 변경됩니까? EmacsLisp : (setq a (list "val")) (setq b (nconc a "val2"))예를 들어. 그 시점에서 a평가하는 것으로 끝납니다 ("val" . "val2").
Jonathan Leech-Pepin 22

답변:


30

C ++

올바른 도구를 사용하는 것은 쉽지 않습니다.

#include <iostream>

using namespace std;

class Obj {
public:
   int state;

   Obj& operator= (Obj& foo) {
      foo.state++;
      this->state = foo.state - 2;
      return *this;
   }
};

int main() {
   Obj a, b, c, d;
   a.state = 3;
   b.state = 4;

   cout << a.state << " " << b.state << "\n";

   c = a;
   d = b;

   cout << a.state << " " << b.state << " " << c.state << " " << d.state << "\n";

   return 0;
}

산출:

3 4
4 5 2 3

12
제목을 본 순간 누군가가 연산자 오버로드를 수행한다는 것을 알았습니다. 분명한 방법입니다. 공감하십시오.

17

PHP (디버그 빌드,> = 5.4)

우리는 getter에서 객체의 참조 횟수를 사용합니다. (따라서 할당에 따라 참조 횟수가 증가하고 값이 변경됩니다)

class State {
    public function __get($arg) {
        ob_start();
        debug_zval_dump($this); // e.g. "object(State)#1 (0) refcount(6)"
        return ob_get_clean()[29];
    }
}

$obj = new State;
var_dump($obj->state);
$a = $obj;
var_dump($obj->state);

14

기음#

두 가지 간단한 옵션 :

class Obj
{
    public int state;
    public static implicit operator int(Obj o)
    {
        return o.state++;
    }
}

static int LValueI;
static Obj LValueM { set { value.state++; } }
static void Main()
{
    var obj = new Obj { state = 1 };
    LValueI = obj;
    Console.WriteLine(obj.state); //2, caused by the implicit cast.

    LValueM = obj;
    Console.WriteLine(obj.state); //3, caused by the property setter.
    Console.ReadLine();
}

또는 단순히 같은 메모리에 쓸 수 있습니다.

[StructLayoutAttribute(LayoutKind.Explicit)]
class Program
{
    [FieldOffset(0)]
    int state = 1;
    [FieldOffset(1)]
    int LValue;

    void Test()
    {
        var obj = this;

        Console.WriteLine(state);  //1
        LValue = state;
        Console.WriteLine(state);  //257
        Console.ReadLine();
    }
    static void Main() { new Program().Test(); }
}

12

여기에 다른 답변보다 훨씬 짧은 TeX

\setbox0=\hbox{Hello world!} % Put stuff in the box 0.
\message{\the\wd0}           % Print the width of the box => non-zero
\setbox2=\box0               % Put the box instead in box 2.
\message{\the\wd0}           % Now box 0 is void, hence has zero width.

조판 시스템으로서 TeX는 조판 재료를 포함하는 "박스"유형을 가지고 있습니다. 가장 일반적인 사용 사례는이 재료를 복사하거나 분할하는 대신이 재료를 옮기거나 나누는 것이므로 상자는 일반적으로 사용될 때 삭제됩니다 (또는 "상자"변수는 포인터이며 한 번에 하나의 포인터 만 가리킬 수 있습니다) 메모리의 실제 상자에). 마법이 필요 없습니다.


8

C ++ 11 (그래서 여러분은 unique_ptr / shared_ptr :-)에 대해 잊어 버렸습니다)

#include <iostream>
#include <memory>
using namespace std;
int main() {
    std::unique_ptr<int> u1(new int(0)), u2;
    std::shared_ptr<int> s1 = std::make_shared<int>(0), s2;
    std::cout<<u1.get()<<" "<<u2.get()<<" "<<std::endl;
    std::cout<<s1.use_count()<<" "<<s2.use_count()<<" "<<std::endl;
    u2 = std::move(u1);
    s2 = s1;
    std::cout<<u1.get()<<" "<<u2.get()<<" "<<std::endl;
    std::cout<<s1.use_count()<<" "<<s2.use_count()<<" "<<std::endl;
   return 0;
}

7

포트란 03

이것은 Hugo의 D 답변과 다소 비슷하지만 조금 더 숨겨져 있습니다 (부분적으로 # $ % ^ 누가 Object Oriented Fortran을 알고 있기 때문에)?

module objects
   implicit none

   type ObjDef
      integer :: state
    contains
      procedure :: initObject
      procedure :: printObject
      procedure :: setNew
   end type
 contains
   subroutine initObject(this)
     class(ObjDef) :: this
     this%state = this%state + 1
   end subroutine initObject

   subroutine printObject(this)
     class(ObjDef) :: this
     print '(a,i0)',"this%state = ",this%state
   end subroutine printObject

   subroutine setNew(this,that)
     class(ObjDef) :: this,that
     that%state = this%state
   end subroutine setNew

end module objects

program objectChange
   use objects
   type(ObjDef) :: a,b

   call initObject(a)
   call printObject(a)
   call b%setNew(a)
   call printObject(a)
end program objectChange

출력은

this%state = 1
this%state = 0

당신이 무슨 일이 있었는지 알아낼 수 있다면, 보너스는 당신에게 포인트! 그렇지 않은 경우 :

프로 시저를 호출 할 때 setNew형태로 call b%setNew(a), b암시 적 첫 번째 인수가 아닌 초입니다.


7

PowerShell

state속성이 객체 를 가리키는 변수의 이름 인 객체를 만듭니다.

$a = @{}| Add-Member -MemberType:16 -PassThru state -Value {
        (gv|?{$this -eq $_.Value}|%{$_.Name}) -join ','} 

'Before: ' + $a.state
$b = $a
'After: ' + $a.state

산출

Before: a,this
After: a,b,this

참고 : 할당이 하위 범위에서 발생하면 작동하지 않습니다.

'Before: ' + $a.state
&{$b = $a}
'After: ' + $a.state

출력

Before: a,this
After: a,this

Get-Variable은 똑똑합니다!
mazzy

5

펄 5

Perl에서이를 수행하는 한 가지 방법이 있습니다.

package Magic {
    sub new { bless {state => 1} }
    use overload '""' => sub { $_[0]{state}++ };
}
use feature 'say';

my $obj = new Magic;
say $obj->{state};
substr($_, 0) = $obj;
say $obj->{state};

이 결과는 다음과 같습니다.

1
2

설명:

이것은 오버로딩 의 간단한 응용입니다 . 특히, 오버 ""로드 된 객체가 할당 될 때 호출되는 문자열 변환 연산자를 오버로드합니다 substr()(예, Perl의 유효한 lvalue입니다).

Perl 에는 많은 변수 가 할당되어있어 그 변수 를 할당합니다. 예를 들어 다음도 작동합니다.

my $obj = new Magic;
say $obj->{state};
$0 = $obj;
say $obj->{state};

대체 솔루션

여기에 다른 방법이 있습니다.

package Magic {
    use Devel::Peek 'SvREFCNT';
    sub new { bless \my $foo }
    sub state { SvREFCNT ${$_[0]} }
}
use feature 'say';

my $obj = new Magic;
say $obj->state;
my $other = $obj;
say $obj->state;

여기에는 state문자에 대한 참조 수를 문자 그대로 계산하는 방법 (추가 넥타이 / 과부하 shenanigans가있는 속성으로 만들 수 있지만 문제가 복잡해질 수 있음)입니다. 따라서 첫 번째 솔루션과 달리 실제로 $obj상태를 변경하기 위해 객체 참조를 보유 할 수있는 일반 변수 를 할당 해야합니다.


5

자바 스크립트

좋아, 그래서 SSCCE로 작동하는 더 짧은 버전을 만들었지 만 더 이상 JavaScript를 올바르게 구문 분석하려고 시도하지 않으므로 더 복잡한 스크립트에 넣을 때 참조 계산이 작동하지 않을 수 있습니다.

(function run () {
    var lineOne = getLine (1), a, b, x, y, z;
    var x = {
        get state () {
            var x=/([a-z]+)\s*=\s*([a-z]+)/,c;
            return 1 + Object.keys (c = run.toString ().split ('\n').slice (0,getLine (2)).filter (function (a) {return (x.test (a))}).reduce (function (a,b,c,d) {var r=b.match (x),t=r[2];while (a[t]){t=a[t]};a[r[1]]=t;return a}, {v:0})).reduce (function (a,b) {return (c[b]=="x"?1:0) + a},0)
        }
    };
    console.log (x.state);  //1
    console.log (x.state);  //1
    y = x;
    console.log (x.state);  //2
    z = y;
    console.log (x.state);  //3    
    a = z;
    b = a;
    console.log (x.state);  //5
    a = null;
    console.log (x.state);  //4
    b = null;
    console.log (x.state);  //3
})() //1 1 2 3 5 4 3 

function getLine(n) {
   try {
      to
   } catch (dat) {
      var stack = dat.stack.split('\n');
       for (var i = 0; i < stack.length; i++) {
           if (~stack[i].indexOf ('getLine')) break;          
       }
      return dat.stack.split ('\n')[i + ~~n].match (/:(\d+)/)[1] - ~~window.hasOwnProperty ('__commandLineAPI')
   }
}

2
당신의 행동을 설명해 주시겠습니까?
Ryan

5
...이 세상에서 무엇입니까? O_o
Doorknob

@Doorknob 함수를 호출 한 결과를 반환하는 getter입니다.이 함수는 할당 된 표현식에서 지정된 소스 텍스트 내에서 주어진 행까지 식별자 이름이 rval로 얼마나 자주 참조되는지를 세는 함수를 전달합니다. getter가 인수로 호출되었습니다. 다른 모든 것은 지저분한 임시 토크 나이저입니다. --- 다른 방법으로 전화해야할지 모르겠습니다 . 다른 말로. 다시 말해, getter는 호출 된 행까지 x에 대한 참조 할당 수를 계산하고 나머지는 완료된 토크 나이저입니다.
C5H8NNaO4 2016

1
가장 긴 그리고 가장 넓은!
Nicolas Barbulesco

1
@NicolasBarbulesco 더 짧게 만들었습니다
C5H8NNaO4

4

파이썬

약간의 속임수이지만 어떻습니까?

import gc
class A(object):
    @property
    def state(self):
        return len(gc.get_referrers(self))

a = A()
print a.state
b = {"x": a}
print a.state
a.y = a
print a.state
del a
print b["x"].state

4

C ++ 11

암시 적 / 명시 적 destrucor를 지원하는 다른 언어에 대해서도 확장 할 수 있지만

#include <iostream>
using namespace std;

class Foo {
    int *ptr;
public:
    Foo() {
        ptr = new int(0);
    }   
    int state() {
        return *ptr;
    }
    ~Foo() {
        (*ptr)++;
    }
};
int main() {
    Foo a, b;
    cout << a.state() << " " << b.state() << "\n";
    {
        Foo c, d;
        c = a;
        d = b;
    }
   cout << a.state() << " " << b.state()  << "\n";

   return 0;
}

기본 할당 연산자는 단순 복사를 수행합니다. 따라서 수신 객체는 여전히 포인터를 소유하며 변경 사항은 원래 객체에 암시 적으로 영향을 미칩니다.


1
예, 프로그램에 new싱글 이 없습니다 delete. 비록이 작업에 충분하다고 생각하지만 :)
Ruslan

출력은 무엇입니까?
Nicolas Barbulesco

1
내가 이해 한 것 (C ++은 멀리 떨어져 있습니다 ...)에서 할당은 상태를 변경하지 않습니다 . 그렇지 않으면 cout라인을 위로 이동하고 }작동하는지 확인하십시오. :-)
Nicolas Barbulesco

4

스칼라

암시 적 변환을 통해 일반 로컬 변수에 할당하면서이를 수행 할 수 있습니다.

import scala.language.implicitConversions

class Obj {
  var counter = 0
}

implicit def o2s(x: Obj): String = {
  x.counter += 1
  x.toString
}

val obj = new Obj
println(obj.counter)
val s: String = obj
println(obj.counter)

유추 된 유형으로도이를 수행 할 수 있습니다.

var s = ""
s = obj

L 값이 필드 여야하지만 사용자 정의 설정 기 메소드를 사용할 수도 있습니다.

object L {
  var _value = new Obj
  def value = _value
  def value_=(x: Obj): Unit = {
    _value = x
    x.counter += 1
  }
}

val obj = new Obj
println(obj.counter)
L.value = obj
println(obj.counter)

3

struct Obj {
    int state;

    void opAssign (ref Obj other) {
        ++other.state;
    }
}

void main () {
    import std.stdio;

    Obj obj, lvalue;
    writeln(obj);
    lvalue = obj;
    writeln(obj);
}

산출:

Obj(0)
Obj(1)

3

루비

약속 한대로 질문에 영감을 준 답변이 있습니다.

obj = Class.new { def self.state; to_s[/</] ? "Has not been assigned\n" : "Assigned to #{to_s}"; end }

print obj.state

LValue = obj

print obj.state

Class.new익명 클래스를 만듭니다. to_s익명 클래스를 호출 하면 객체의 기본 문자열 표현이 다음과 같이 나타납니다 #<Class:0x007fe3b38ed958>. 그러나 클래스가 상수에 할당 to_s되면 해당 상수가됩니다. 루비에서 상수는 대문자로 시작하는 변수이므로obj 익명을 유지할 수있는 클래스에 대한 참조입니다.

내 코드 to_sstate메소드로 래핑 되므로 출력은

Has not been assigned
Assigned to LValue

여기에있는 대부분의 솔루션과 달리 이것은 한 번만 작동합니다. obj다른 상수에 할당 해도 문자열 표현이 변경되지 않으며에 새로운 값을 할당하지 않습니다 LValue.


3

자바에서

Java에서는 이것이 불가능하다고 생각했습니다. 그러나…

메인 클래스 :

public class MyAppOfCats {

  public static void main(String[] args) {
    Cat tom = new Cat();
    System.out.println(tom.state()); 
    // Output : NOT-BEST-CAT
    Cat.bestCat = tom;
    System.out.println(tom.state());
    // Output : BEST-CAT
  }

}

클래스 고양이 :

public class Cat {

  static Cat bestCat;

  public Cat() {
    super();
  }

  public String state() {
      return ((this == Cat.bestCat) ? "BEST-CAT" : "NOT-BEST-CAT");
  }

}

@tbodt에서 영감을 받았습니다.


1
코드 골프가 아니라는 것을 알고 있지만 생성자를 제거 할 수 있으며 여전히 동일하다는 것을 알고 있습니까?
David Conrad

2
이것은 "할당시 상태가 변하는 객체"가 아닙니다. 이것은 당신이 세계적인 가치를 조작하고 그것을 바탕으로 무언가를 인쇄하는 것입니다. Cat.x = 2인쇄와 다르지 않습니다 Cat.x.
Chris Hayes

@Chris — 객체 상태 는 "전역 값"을 기반으로합니다. 따라서 할당시 객체 상태가 변경됩니다. 문제 ;-) 상태 가 결정적이고 dem 등한 방법 일 수 있다는 것이다. 내 메소드 state () 는 그런 메소드입니다.
Nicolas Barbulesco

아니요, 이 특정 할당 에서 객체 상태가 변경됩니다 . 내가 Cat otherCat = tom한 상태라면 전혀 바뀌지 않았을 것입니다. 나는 이것이 규칙의 글자 나 정신에 맞는다고 믿기 힘들다.
Chris Hayes

@Chris — 물론이 할당에서 객체가 변경됩니다! 이 질문은 과제에 의해 상태가 변경되는 객체를 요청합니다. 할당에 의해 상태가 변경되는 객체에는 적합하지 않습니다.
Nicolas Barbulesco

3

C ++

이 동작은 실제로 표준에 지정되어 있으므로 더 이상 사용되지 않습니다.

#include<iostream>
#include<memory>
int main()
{
    std::auto_ptr<int> a(new int(0));
    std::cout<<a.get()<<'\n';
    std::auto_ptr<int> b = a;
    std::cout<<a.get()<<'\n';
}

산출

some address
0

이것을 일으키는 과정은 Abhijit의 대답 std::move과 동일하지만 marinus의 대답과 동일하지는 않지만 직접 정의하는 대신 표준 클래스를 사용합니다.

편집 : 설명을 추가하고 있습니다. 출력에서 "일부 주소"는 실제로 할당 된 정수의 주소에 대한 16 진수 값입니다. std::auto_ptr다른 상점에 할당되면 상점 포인터를 해제하고 auto_ptr내부 포인터를 0으로 설정합니다. 호출 get()은 상점 포인터에 대한 액세스를 검색합니다.


여기서 "출력"이 실제 출력이 아니라고 생각합니다.
Nicolas Barbulesco

이것이 무엇을해야하는지 설명 할 수 있습니까? 특히 방법은 get()? 마지막에 왜 0을 반환합니까?
Nicolas Barbulesco

@ 니콜라스 네. 이 출력은 실제 출력이 아니지만 더 일반적인 출력입니다 (또한 컴파일러에 액세스 할 수 없으므로 당시 유효한 주소의 예가 없었습니다).
JKor

1
흠, 이것은 gcc 4.8에서 컴파일되지 않습니다.
Michael Hampton

1
컴파일 오류를 수정했습니다. auto_ptr더 이상 사용되지 않으므로 c ++ 11 용으로 컴파일하는 경우 경고가 계속 표시됩니다 .
JKor

3

파이썬

import sys
class K:state = property(sys.getrefcount)

2

파이썬 2.x

추가 클래스를 정의하지 않고이를 수행하는 적절한 방법을 찾을 수 없습니다.

class State(object):
    def __init__(self):
        self.state = 0
    def __set__(self, obj, other):
        # Keep different references
        other.state += 1
        self.state += 2

class Program(object):
    obj, value = State(), State() # Create two State-objects
    def __init__(self):
        print "Before assignment:", self.obj.state, self.value.state # 0 0
        self.value = self.obj # Set value to obj (supposedly)
        print "After  assignment:", self.obj.state, self.value.state # 1 2
        self.value = self.obj
        print "2nd    assignment:", self.obj.state, self.value.state # 2 4

Program()

2

자바

다른 모든 솔루션은 해당 언어의 연산자 오버로딩 형식을 사용합니다. Java에는 연산자 오버로드가 없으므로 갇혀 있다고 생각했습니다. 그러나 나는 무언가를 생각해 냈습니다.

메인 클래스는 다음과 같습니다.

public class Program {
    public static void main(String[] args) {
        Thing thing = new Thing(0);
        System.out.println(thing.getState());
        Thing.otherThing = thing;
        Thread.sleep(1);
        System.out.println(thing.getState());
    }
}

의심스러운 줄이 몇 개 있지만 Thing수업이 완전히 정상 이라면 아무것도하지 않습니다 . 그렇지 않습니다 :

public class Thing {
    private int state;

    public Thing(int state) {
        this.state = state;
    }

    public int getState() {
        return state;
    }

    // Please do your best to ignore the rest of this class.
    public static volatile Thing otherThing;
    static {
        Thread t = new Thread() {
            public void run() {
                Thing t = otherThing;
                while (true)
                    if (t != otherThing) {
                        t = otherThing;
                        t.state++;
                    }
            }
        };
        t.setDaemon(true);
        t.start();
    }
}

스레드로 인해 작동한다고 보장되지는 않지만 JDK 1.8u5에서 테스트했으며 작동합니다.



@KyleKanos 모든 유니 코드 문자를 제거했습니다.> U + 00FF
tbodt

1

공통 리스프

상태를 벡터에 바인딩 된 특수 변수의 수로 정의합니다. 따라서 특수 변수에 할당하면 상태가 변경됩니다.

(defgeneric state (object)
  (:documentation "Get the state of this object."))

(defmethod state ((object vector))
  ;; The state of a vector is the number of symbols bound to it.
  (let ((count 0))
    ;; Iterate each SYM, return COUNT.
    (do-all-symbols (sym count)
      ;; When SYM is bound to this vector, increment COUNT.
      (when (and (boundp sym) (eq (symbol-value sym) object))
    (incf count)))))

(defparameter *a* #(this is a vector))
(defparameter *b* nil)
(defparameter *c* nil)

(print (state *a*))
(setf *b* *a*)
(print (state *a*))
(print (state *a*))
(setf *c* *a*)
(print (state *a*))

산출:

1 
2 
2 
3 

어휘 변수 나 개체 내 슬롯이 아닌 특수 변수에 대한 할당에서만 작동합니다.

조심해 do-all-symbols모든 패키지를 패키지가없는 변수가 누락됩니다. 둘 이상의 패키지에 존재하는 기호를 두 번 계산할 수 있습니다 (한 패키지가 다른 패키지에서 기호를 가져온 경우).

루비

루비는 거의 동일하지만 상태를 배열을 참조하는 상수의 수로 정의합니다.

class Array
  # Get the state of this object.
  def state
    # The state of an array is the number of constants in modules
    # where the constants refer to this array.
    ObjectSpace.each_object(Module).inject(0) {|count, mod|
      count + mod.constants(false).count {|sym|
        begin
          mod.const_get(sym, false).equal?(self)
        rescue NameError
          false
        end
      }
    }
  end
end

A = %i[this is an array]
puts A.state
B = A
puts A.state
puts A.state
C = A
puts A.state

산출:

state-assign.rb:9:in `const_get': Use RbConfig instead of obsolete and deprecated Config.
1
2
2
3

이것은 클래스 나 모듈이 아닌 Ruby 객체에 대한 histocrat의 답변 을 일반화 한 것입니다 . 구성 상수는 경고를 만든 일부 코드를 자동로드하기 때문에 경고가 나타납니다.


0

C ++

플랫폼마다 결과가 다를 수 있습니다. ideone에서 테스트했습니다 .

#include <iostream>
#include <cassert>
// File format: [ciiiiciiii...] a char (1 byte) followed by its state (4 bytes)
// Each group takes 5 bytes
char Buffer[30]; // 5*6, six groups

struct Group {
    char c;
    int state;
};

int main(void) {
    assert(sizeof(char) == 1);
    assert(sizeof(int) == 4);

    Group& first_group = *(Group*)(&Buffer[0]); // Group 1 is at 0
    Group& second_group = *(Group*)(&Buffer[5]); // Group 2 is at 5

    first_group.c = '2';
    first_group.state = 1234;

    std::cout << first_group.state << std::endl;

    second_group = first_group;

    std::cout << first_group.state << std::endl;

    return 0;
}

산출:

1234
13010

0

기음#

class A
{
    public int N { get; set; }
    public override string ToString() { return N.ToString(); }
}
class B
{
    public int N { get; set; }
    public override string ToString() { return N.ToString(); }
    public static implicit operator A(B b) { b.N = -b.N; return new A { N = b.N }; }
}
public static void Test()
{
    A a = new A { N = 1 };
    B b = new B { N = 2 };
    Console.WriteLine("a is {0}, b is {1}", a, b);
    Console.WriteLine("a is {0}, b is {1}", a, b);
    a = b;
    Console.WriteLine("a is {0}, b is {1}", a, b);
    Console.WriteLine("a is {0}, b is {1}", a, b);
}

산출:

a is 1, b is 2
a is 1, b is 2
a is -2, b is -2
a is -2, b is -2

이것은 무엇을 하는가? 이 연산자가 과부하 =입니까?
Nicolas Barbulesco

@Nicolas 정확하지 않습니다. 부작용이 있기 때문에 a에서 a B로 캐스팅 할 때 입니다. Aimplicit operator A(B b)
ClickRick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.