Rails - 将对象转换为字符串时会发生什么?

时间:2014-03-09 11:41:51

标签: ruby-on-rails ruby-on-rails-4 rails-console

我正在使用Rails控制台。偶然的机会,我意外地将一个对象转换为一个字符串。 以下是我的代码。

Rails控制台

user = User.find(1)
user.to_s  # returns <User:0x00000103ada530>

我的问题是,什么是<User:0x00000103ada530>?它是否像用户的ID?如果我输入<User:0x00000103ada530>,我会回来User.find(1)

谢谢

2 个答案:

答案 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现在将引用同一个对象。