Ruby对象打印为指针
我试图创建一个类,它有一个接受单个参数的构造函数。当我创建对象的新实例时,它返回一个指针Ruby对象打印为指针,ruby,class,constructor,initialization,Ruby,Class,Constructor,Initialization,我试图创建一个类,它有一个接受单个参数的构造函数。当我创建对象的新实例时,它返回一个指针 class Adder def initialize(my_num) @my_num = my_num end end y = Adder.new(12) puts y 我做错了什么? 谢谢,那是因为对象是指针。在Ruby中,所有对象都分配在堆上,变量只是对它们的引用 当你这样做的时候 puts y 它实际上是调用对象的默认方法,只输出类名、内存位置和有关对象实例变量的一
class Adder
def initialize(my_num)
@my_num = my_num
end
end
y = Adder.new(12)
puts y
我做错了什么?
谢谢,那是因为对象是指针。在Ruby中,所有对象都分配在堆上,变量只是对它们的引用
当你这样做的时候
puts y
它实际上是调用对象的默认方法,只输出类名、内存位置和有关对象实例变量的一些信息。Ruby没有指针。在您的示例中,
y
是Adder
的一个实例,其实例变量名为@my_num
,其值为12
(其本身是Fixnum
对象)
put
方法调用to\u s
方法来传递任何参数。这就是你看到的输出;也许您认为输出引用了指针,但它只是对象的文本表示。您可以通过为任何类重写到_s
实例方法来更改它。您没有做错任何事情。假设您看到类似于#
的内容,那么在Ruby中,这只是您创建的对象的默认表示形式
如果要在将对象传递到put
时将此行为更改为更友好的行为,可以重写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
然后,当您执行放置y
时,您将看到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
当您使用new
方法时,您将在新创建的对象上获得“引用”put
kernel方法返回有关此对象的一些内部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\u reader:my\u num
而不是定义自己的方法,这将是有益的。当然,但我认为使用一个getter方法对于主题启动者来说会更清楚:)事实上,我已经更新了我的消息,感谢您提到了attr\u reader,然后使用了attr\u访问器。attr_reader也可以工作。它只允许您获取值,而attr_accessor还允许您为my_num分配一个新值。