하나의 인수를 취하는 생성자가있는 클래스를 만들려고합니다. 객체의 새 인스턴스를 만들면 포인터를 반환합니다.Ruby 객체가 포인터로 출력됩니다.
class Adder
def initialize(my_num)
@my_num = my_num
end
end
y = Adder.new(12)
puts y
내가 뭘 잘못하고 있니? 감사합니다
하나의 인수를 취하는 생성자가있는 클래스를 만들려고합니다. 객체의 새 인스턴스를 만들면 포인터를 반환합니다.Ruby 객체가 포인터로 출력됩니다.
class Adder
def initialize(my_num)
@my_num = my_num
end
end
y = Adder.new(12)
puts y
내가 뭘 잘못하고 있니? 감사합니다
, 당신은 새로 생성 된 개체에 대한 '참조'를 얻을. 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
을
왜냐하면 객체 이 포인터 인이기 때문입니다. 루비에서는 모든 객체가 힙에 할당되고 변수는 그 객체에 대한 참조 일뿐입니다.
당신은 실제로 단지 출력 클래스 이름, 메모리 위치 및 개체의 인스턴스 변수에 대한 몇 가지 정보에있는 객체의 기본 그리고 to_s 메소드를 호출한다
puts y
을 수행 할 때.
루비에는 포인터가 없습니다. 귀하의 예에서 y
은 12
값을 가진 @my_num
이라는 인스턴스 변수 (자체는 Fixnum
개체 임)가있는 Adder
의 인스턴스입니다.
puts
메서드는 전달하는 모든 인수에 대해 to_s
메서드를 호출합니다. 그것이 출력물을 보는 이유입니다. 아마도 출력은 포인터를 가리키고 있다고 생각 하겠지만 그것은 단지 객체의 텍스트 표현 일뿐입니다. 모든 클래스에 대해 to_s
인스턴스 메소드를 대체하여이를 변경할 수 있습니다.
잘못된 것은 아닙니다. #<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
동일한 작업을 수행하는 자체 메서드를 정의하는 대신 여기에'attr_reader : my_num'을 사용하는 것이 유용 할 것입니다. – tadman
물론 하나의 getter 메소드를 사용하면 topic starter에 대해 더 명확해질 것이라고 생각했습니다. 실제로, 메시지를 업데이트했습니다. – WarHog
attr_reader가 언급 된 다음 attr_accessor가 사용되었습니다. attr_reader도 작동합니다. attr_accessor를 사용하면 my_num에 새 값을 지정할 수도 있습니다. –