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(值为12Adder实例(它本身就是一个Fixnum对象)。

puts方法调用传递它的任何参数的to_s方法。 这就是你看到的结果; 也许你认为输出是指向一个指针,但它只是对象的文本表示。 您可以通过覆盖任何类的to_s实例方法来更改它。