【问题标题】:Class variable is getting overridden类变量被覆盖
【发布时间】:2012-10-03 22:38:51
【问题描述】:

我遇到了一个使用哈希作为类变量的奇怪问题。运行以下代码后,我希望类变量@@class_hash 应该包含{:one => {'a' => 'one'}, :two => {'a' => 'two'}}

但是,在我运行这段代码之后,@@class_hash{:one => {'a' => 'two'}, :two => {'a' => 'two'}}

这是为什么呢?

class Klass
  @@class_hash = Hash.new({})

  def fun1
    @@class_hash[:one]['a'] = 'one'
  end

  def fun2
    @@class_hash[:two]['a'] = 'two'
  end

  def class_hash
    @@class_hash
  end
end

klass = Klass.new

klass.fun1
h1 = klass.class_hash
raise "h2[:one]['a'] should be 'one', not 'two'" if h1[:one]['a'] == 'two'
klass.fun2
h2 = klass.class_hash
raise "h2[:one]['a'] should be 'one', not 'two'" if h2[:one]['a'] == 'two'

【问题讨论】:

    标签: ruby ruby-1.9.2


    【解决方案1】:

    Hash.new 的参数用作默认值,在您的情况下为 {}。

    对未知键的每次访问都使用完全相同的对象(r​​uby 不会神奇地为您复制它),因此在您的情况下,每个键的值都是完全相同的哈希值。你可以用块状表格完成我认为你想要的事情

    Hash.new {|hash, key| hash[key] ={} }
    

    在这种情况下,每个缺失的键都使用不同的空哈希。

    【讨论】:

      猜你喜欢
      • 2013-11-30
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 2019-03-03
      • 2021-05-04
      • 2012-02-24
      相关资源
      最近更新 更多