2011-11-14 3 views
41

하나의 인수를 취하는 생성자가있는 클래스를 만들려고합니다. 객체의 새 인스턴스를 만들면 포인터를 반환합니다.Ruby 객체가 포인터로 출력됩니다.

class Adder 
    def initialize(my_num) 
     @my_num = my_num 
    end 
end 
y = Adder.new(12) 
puts y 

내가 뭘 잘못하고 있니? 감사합니다

답변

70

, 당신은 새로 생성 된 개체에 대한 '참조'를 얻을. puts 커널 메소드는이 객체에 대한 내부 루비 정보를 반환합니다. 이 상태 개체에 대한 정보를 얻고 싶다면, 당신은 게터 방법을 사용할 수 있습니다

class Adder 
    def initialize(my_num) 
    @my_num = my_num 
    end 
    def my_num 
    @my_num 
    end 
end 
y = Adder.new(12) 
puts y.my_num # => 12 

을 또는 당신은 장면 뒤에 세터와 게터 방법의 몇 가지 정의 'attr_reader'방법을 사용할 수 있습니다

class Adder 
    attr_accessor :my_num 

    def initialize(my_num) 
    @my_num = my_num 
    end  
end 
y = Adder.new(12) 
puts y.my_num # => 12 
+6

동일한 작업을 수행하는 자체 메서드를 정의하는 대신 여기에'attr_reader : my_num'을 사용하는 것이 유용 할 것입니다. – tadman

+1

물론 하나의 getter 메소드를 사용하면 topic starter에 대해 더 명확해질 것이라고 생각했습니다. 실제로, 메시지를 업데이트했습니다. – WarHog

+5

attr_reader가 언급 된 다음 attr_accessor가 사용되었습니다. attr_reader도 작동합니다. attr_accessor를 사용하면 my_num에 새 값을 지정할 수도 있습니다. –

4

왜냐하면 객체 이 포인터 인이기 때문입니다. 루비에서는 모든 객체가 힙에 할당되고 변수는 그 객체에 대한 참조 일뿐입니다.

당신은 실제로 단지 출력 클래스 이름, 메모리 위치 및 개체의 인스턴스 변수에 대한 몇 가지 정보에있는 객체의 기본 그리고 to_s 메소드를 호출한다

puts y 

을 수행 할 때.

4

루비에는 포인터가 없습니다. 귀하의 예에서 y12 값을 가진 @my_num이라는 인스턴스 변수 (자체는 Fixnum 개체 임)가있는 Adder의 인스턴스입니다.

puts 메서드는 전달하는 모든 인수에 대해 to_s 메서드를 호출합니다. 그것이 출력물을 보는 이유입니다. 아마도 출력은 포인터를 가리키고 있다고 생각 하겠지만 그것은 단지 객체의 텍스트 표현 일뿐입니다. 모든 클래스에 대해 to_s 인스턴스 메소드를 대체하여이를 변경할 수 있습니다.

15

잘못된 것은 아닙니다. #<Adder:0xb7f9f710 @my_num=12>과 같은 것을 본다고 가정하면, 이것은 Ruby에서 작성한 객체의 기본 표현 일뿐입니다.

puts에 개체를 전달할 때이 동작을 좀 더 친숙하게 변경하려면 to_s (to 문자열) 메서드를 재정의 할 수 있습니다. 예 : 당신이 puts y을 할 때 Adder with my_num = 12

당신은 또한 예를 들어, 사용하는 것입니다 inspect 방법을 대체 할 수 있습니다 볼 수 있습니다 다음

class Adder 
    def initialize(my_num) 
    @my_num = my_num 
    end 

    def to_s 
    "Adder with my_num = #{@my_num}" 
    end 
end 

는 때 루비 IRB 콘솔은 예를 들어, 개체의 표현을 인쇄 IRB에서 다음

class Adder 
    def inspect 
    to_s # return same representation as to_s 
    end 
end 

: 당신이 new 방법을 사용하면

>> y = Adder.new 12 
=> Adder with my_num = 12 
관련 문제