我正在使用Rails控制台。偶然的机会,我意外地将一个对象转换为一个字符串。 以下是我的代码。
user = User.find(1)
user.to_s # returns <User:0x00000103ada530>
我的问题是,什么是<User:0x00000103ada530>
?它是否像用户的ID?如果我输入<User:0x00000103ada530>
,我会回来User.find(1)
谢谢
答案 0 :(得分:7)
我可能错了,但是
0x00000103ada530
是记忆中的地址
你调用User.new的地方,它分配内存空间,空间有地址:0x00000103ada530
例如,一个类的2个实例不是同一个地方的商店
class Test
end
t1 = Test.allocate # the same as Test.new, but just allocates a memory space for t1
t2 = Test.allocate
p t1 === t2 # false
p t1.inspect # "#<Test:0x007f17555ff398>"
p t2.inspect # "#<Test:0x007f17555ff370>"
如果您需要用户的#to_s方法,您可以设置方法
class User < ActiveRecord::Base
. . .
def to_s
"#{first_name} #{last_name}"
end
. . .
end
User.first.to_s # => John Doe
答案 1 :(得分:2)
#to_s方法按如下方式对对象的id进行编码:
(obj.object_id * 2).to_s(16)
如果你想从#to_s的结果回到对象,你可以使用ObjectSpace,如果你在MRI上:
o = Object.new
o2 = ObjectSpace._id2ref(o.to_s.split(":").last.hex / 2)
o和o2现在将引用同一个对象。