【问题标题】:Rails - What happens when I convert an object into string?Rails - 当我将对象转换为字符串时会发生什么?
【发布时间】:2014-04-12 11:14:42
【问题描述】:

我在玩 Rails 控制台。一个偶然的机会,我不小心将一个对象转换成一个字符串。 以下是我的代码。

Rails 控制台

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

我的问题是,&lt;User:0x00000103ada530&gt; 是什么?它像用户的ID吗?是我输入&lt;User:0x00000103ada530&gt;我会回来User.find(1)

谢谢

【问题讨论】:

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


    【解决方案1】:

    我可能错了,但是

    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
    

    【讨论】:

    • 可以逆转这个过程吗?用&lt;User:0x00000103ada530&gt;取回记录?
    【解决方案2】:

    #to_s 方法将对象的 id 编码如下:

       (obj.object_id * 2).to_s(16)
    

    如果您想从 #to_s 的结果返回到对象,如果您在 MRI 上,您可以使用 ObjectSpace:

    o = Object.new
    o2 = ObjectSpace._id2ref(o.to_s.split(":").last.hex / 2)
    

    o 和 o2 现在将引用同一个对象。

    【讨论】:

      猜你喜欢
      • 2011-10-31
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      相关资源
      最近更新 更多