【发布时间】:2011-11-14 17:59:54
【问题描述】:
我正在尝试创建一个类,它有一个带有单个参数的构造函数。当我创建对象的新实例时,它会返回一个指针。
class Adder
def initialize(my_num)
@my_num = my_num
end
end
y = Adder.new(12)
puts y
我做错了什么? 谢谢
【问题讨论】:
标签: ruby class constructor initialization
我正在尝试创建一个类,它有一个带有单个参数的构造函数。当我创建对象的新实例时,它会返回一个指针。
class Adder
def initialize(my_num)
@my_num = my_num
end
end
y = Adder.new(12)
puts y
我做错了什么? 谢谢
【问题讨论】:
标签: ruby class constructor initialization
当您使用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
【讨论】:
attr_reader :my_num 比定义你自己的方法来做同样的事情会有好处。
你没有做错任何事。假设您看到类似 #<Adder:0xb7f9f710 @my_num=12> 的内容,那么在 Ruby 中,这只是您创建的对象的默认表示。
如果您想在将对象传递给puts 时将此行为更改为更友好,您可以覆盖 to_s(到字符串)方法。例如
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
【讨论】:
那是因为对象是一个指针。在 Ruby 中,所有对象都分配在堆上,变量只是对它们的引用。
当你这样做时
puts y
其实是调用对象默认的to_s方法,就是输出对象的类名,内存位置,以及一些实例变量的信息。
【讨论】:
Ruby 没有指针。在您的示例中,y 是 Adder 的一个实例,其实例变量名为 @my_num,其值为 12(它本身就是一个 Fixnum 对象)。
puts 方法调用您传递给它的任何参数的to_s 方法。这就是你看到的输出;也许你认为输出指的是一个指针,但它只是对象的文本表示。您可以通过覆盖任何类的 to_s 实例方法来更改它。
【讨论】: