Ruby对象打印为指针

use*_*856 40 ruby constructor initialization class

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

class Adder
    def initialize(my_num)
        @my_num = my_num
    end
end
y = Adder.new(12)
puts y
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?谢谢

War*_*Hog 70

当您使用new方法时,您将在新创建的对象上获得"引用".putskernel方法返回有关此对象的一些内部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
Run Code Online (Sandbox Code Playgroud)

或者您可以使用'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
Run Code Online (Sandbox Code Playgroud)

  • 在这里使用`attr_reader:my_num`而不是定义自己的方法也是有益的. (6认同)
  • 请注意,提到了attr_reader,然后使用了attr_accessor.attr_reader也有效.它只允许你获取值,而attr_accessor允许你也为my_num分配一个新值. (5认同)

mik*_*kej 15

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

如果要在将对象传递给对象时将此行为更改为更友好,则puts可以覆盖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
Run Code Online (Sandbox Code Playgroud)

然后,当你这样做时,puts y你会看到Adder with my_num = 12

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

class Adder
  def inspect
    to_s # return same representation as to_s
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在irb:

>> y = Adder.new 12
=> Adder with my_num = 12
Run Code Online (Sandbox Code Playgroud)