Ruby对象打印为指针

时间:2011-11-14 17:59:55

标签: ruby class constructor initialization

我正在尝试创建一个类,它有一个带有单个参数的构造函数。当我创建对象的新实例时,它返回一个指针。

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

我做错了什么? 感谢

4 个答案:

答案 0 :(得分:70)

当您使用new方法时,您会在新创建的对象上获得“引用”。 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

答案 1 :(得分:15)

你没有做错任何事。假设您看到类似#<Adder:0xb7f9f710 @my_num=12>的内容,那么在Ruby中,这只是您创建的对象的默认表示。

如果要在将对象传递给puts时将此行为更加友好,则可以覆盖to_s(to string)方法。 e.g。

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

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

然后当您执行puts y时,您会看到Adder with my_num = 12

您还可以覆盖使用的inspect方法,例如,当Ruby irb控制台打印对象的表示时,例如。

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

然后在irb:

>> y = Adder.new 12
=> Adder with my_num = 12

答案 2 :(得分:4)

那是因为对象指针。在Ruby中,所有对象都在堆上分配,变量只是对它们的引用。

当你这样做时

puts y

它实际上是调用对象的默认to_s方法,它只是输出类名,内存位置以及对象实例变量的一些信息。

答案 3 :(得分:4)

Ruby没有指针。在您的示例中,yAdder的实例,其实例变量名为@my_num,其值为12(其本身为Fixnum个对象)。

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