는, 당신은 루비의 모든 변수를 고려하는 것이 좋습니다 예 :
그래서, 입력로 수업을, 다음은 몇 가지 작업 출력됩니다 또는 달리, 다른 개체에 대한 참조로. Ruby의 모든 것이 객체이기 때문에 NilClass 유형 인 nil
조차도 모든 상황에서 마찬가지입니다.
참조 할 개체를 확인하려면 object_id
메서드를 사용하여 구별 할 수 있습니다. 이는 C++에서 &
을 사용하는 포인터로 변환하는 것과 비슷합니다. a
이후
a = "foo"
b = a
a.object_id == b.object_id
# => true
가 해당 문자열에 대한 참조이며, b
는 그들은 실제로 같은 객체에 대한 다른 참조입니다, a
의 복사본입니다 :
이를 생각해 보자. 객체를 수정하는 작업이 동등하게 모든 참조 영향을주기 때문에
이
중요하다 : 만들
그러나
a << "bar"
# => "foobar"
b
# => "foobar"
, 작업을 새로운 모든 사본 수정하지 않습니다 목적 :
a += "baz"
# => "foobarbaz"
b
# => "foobar"
을 Ruby의 많은 메소드는 in-place와 new-copy 버전을 구별하기 위해 !
으로 구분되어 있지만, 항상 그런 것은 아니므로 각 메소드에 대해 잘 알고 있어야합니다.
일반적으로 할당은 이전 참조를 새로운 참조로 바꿀 것이므로, 어림짐작으로 =
은 이전 참조를 대체합니다. 이것은 +=
, -=
, ||=
, &&=
등등에 적용됩니다.
편집 :ObjectSpace._id2ref(object_id)
을 사용하여 개체 식별자를 개체로 변환하는 것에 대한 Phrogz의 의견을 기반으로 업데이트되었습니다. 로
복사 하시겠습니까? 같은 개체 'n'에서 'q'점은 않습니다. 복사 할 필요가 없습니다. 'n.a'를 변경하면 'q.a'는 같은 값을 보게됩니다. –
좋은 지적은 내가 잘못 얘기했다고 생각합니다.질문이 업데이트되었습니다. – SundayMonday
'attr_accessor'는 인스턴스 변수/메소드를 정의하고,'m'과'n'은 각각 자신의 값을 봅니다. 'q'는 'n'을 가리키며 'n'의 역할을합니다. –