Ruby对象打印出来作为指针
我试图创build一个类,它有一个构造函数,只有一个参数。 当我创build对象的新实例时,它将返回一个指针。
class Adder def initialize(my_num) @my_num = my_num end end y = Adder.new(12) puts y
我究竟做错了什么? 谢谢
当你使用new
方法,你得到新创build的对象的“引用”。 puts
内核方法返回一些关于这个对象的内部ruby信息。 如果你想获得关于声明你的对象的任何信息,你可以使用getter方法:
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'方法在场景后面定义一些setter和getter方法:
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
你没有做错什么。 假设你看到#<Adder:0xb7f9f710 @my_num=12>
那么在Ruby中,这只是你创build的对象的默认表示。
如果你想改变这个行为,当你传递你的对象的时候更友好,你可以重写to_s(to string)方法。 例如
class Adder def initialize(my_num) @my_num = my_num end def to_s "Adder with my_num = #{@my_num}" end end
那么当你这样做的时候你会看到Adder with my_num = 12
您也可以重写使用的inspect
方法,例如,当Ruby irb控制台打印对象的表示forms时,例如
class Adder def inspect to_s # return same representation as to_s end end
然后在irb:
>> y = Adder.new 12 => Adder with my_num = 12
这是因为对象是一个指针。 在Ruby中,所有对象都分配在堆上,而variables只是对它们的引用。
当你这样做
puts y
它实际上是调用对象的默认的to_s方法,它只是输出类名,内存位置和对象实例variables的一些信息。
Ruby没有指针。 在你的例子中, y
是一个带有一个名为@my_num
的实例variables(值为12
的Adder
实例(它本身就是一个Fixnum
对象)。
puts
方法调用传递它的任何参数的to_s
方法。 这就是你看到的结果; 也许你认为输出是指向一个指针,但它只是对象的文本表示。 您可以通过覆盖任何类的to_s
实例方法来更改它。