2011-12-01 5 views
3

C++ 배경에서 오는 것은 Ruby에서 객체 할당에 대해 궁금합니다. 다음 개체 할당을 위해해야한다 무엇 고려 사항 (있는 경우) : 모든 이후Ruby에서 객체 할당

class MyClass 

    attr_accessor :a, :b 

    def initialize(a, b) 
    @a = a 
    @b = b 
    end 

    def some_method 
    puts "#{self.a} #{self.b}" 
    end 
end 

m = MyClass.new("first", "last") 
n = MyClass.new("pizza", "hello") 

q = n 
q.some_method 
+2

복사 하시겠습니까? 같은 개체 'n'에서 'q'점은 않습니다. 복사 할 필요가 없습니다. 'n.a'를 변경하면 'q.a'는 같은 값을 보게됩니다. –

+0

좋은 지적은 내가 잘못 얘기했다고 생각합니다.질문이 업데이트되었습니다. – SundayMonday

+1

'attr_accessor'는 인스턴스 변수/메소드를 정의하고,'m'과'n'은 각각 자신의 값을 봅니다. 'q'는 'n'을 가리키며 'n'의 역할을합니다. –

답변

11

는, 당신은 루비의 모든 변수를 고려하는 것이 좋습니다 예 :

그래서, 입력로 수업을, 다음은 몇 가지 작업 출력됩니다 또는 달리, 다른 개체에 대한 참조로. 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의 의견을 기반으로 업데이트되었습니다. 로

+1

[object_id를 기반으로 개체에 액세스 할 수 있습니다.] (http://stackoverflow.com/questions/8264732/can-i-or-should-i-find-an-object-by-the-object -id-attribute-in-ruby). – Phrogz

3

루비의 객체이며, 할당은 참조에 의해 항상. 당신이 C++에 익숙하다면

str = "foo" 
foo = MyClass.new(str, "bar") 
foo.some_method # foo bar 
bar = foo 
bar == foo # true 
bar.some_method # foo bar 
str << "bar" # strings are mutable on ruby, so str is now "foobar" 
foo.some_method # foobar bar 
bar.some_method # foobar bar 
1

나는 이것을 다시 것입니다 : 당신이 실제로 클래스

attr_accessor에 의해 정의 된 게터/세터 메소드를 사용하고

class MyClass 

    attr_accessor :a, :b 

    def initialize(a, b) 
    self.a = a 
    self.b = b 
    end 

    def some_method 
    puts "#{a} #{b}" 
    end 
end 

이 방법은 q = n을 할당 할 때, q는 그냥 같은 메모리를 참조 n에 설정된 위치. 개체가 복사되지 않습니다.