【问题标题】:ruby : can't understand memory addressruby:无法理解内存地址
【发布时间】:2020-07-31 00:20:55
【问题描述】:

当我研究 clone vs dup 时,我尝试复制如下对象:

a = {'key1' => 1, 'key2' => {'key3' => 3, 'key4' => 4}}.freeze
b = a.clone
c = a.dup

a['key1'] = 32
# => RuntimeError: can't modify frozen Hash

b['key1'] = 32
# => RuntimeError: can't modify frozen Hash

c['key1'] = 32
# => 32

大写结果,a和b值共享内存 但是,当我检查变量 object_id 时,它会返回不同的结果:

a.object_id ## original
=> 70219554622880
b.object_id ## clone
=> 70219554589820

但在哈希键中 object_id 是相同的。

a['key1'].object_id ## original
=> 3
b['key1'].object_id ## clone
=> 3
c['key1'].object_id ## dup
=> 65

我不明白 a 和 b 变量与 object_id 不匹配,但在哈希键 object_id 中是相同的。

您能告诉我您的想法、答案或意见吗? 谢谢。

【问题讨论】:

    标签: ruby


    【解决方案1】:

    您可能会因为使用整数而感到困惑。 Ruby 中的整数是单例:它们的整数值决定了它们的对象 ID。

    x = 3
    y = 3
    x.object_id == y.object_id # true
    x = "a"
    y = "a"
    x.object_id == y.object_id # false
    

    但这仅适用于不超过特定大小的整数。

    x = 11111111111111111111111111111111
    y = 11111111111111111111111111111111
    x.object_id == y.object_id # false
    

    这是因为如果对象 id 足够小,Ruby 实际上会将整数值存储在对象 id 中。如果数字太大,则必须分配一个新对象。

    【讨论】:

      猜你喜欢
      • 2011-01-23
      • 1970-01-01
      • 2020-12-28
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-06
      • 1970-01-01
      相关资源
      最近更新 更多