当具有选定翻译键的局部变量发生变化时,为什么 I18n 翻译会发生变化?

Why I18n translations change when local variable with a selected translation key changes?

今天这在我之上。希望有人能给我解释一下!

假设您有一个 rails 项目,其中的 en.yml 文件包含以下内容:

en:
  foo:
    foo: foo
    bar: bar

将I18n.t(:foo)的结果赋值给一个局部变量,你得到一个Hash:

2.0.0-p353 :001 > a = I18n.t(:foo)
 => {:foo=>"foo", :bar=>"bar"}

现在,更改此哈希中的键的值会导致 I18n.t('foo.foo'):

发生变化
2.0.0-p353 :005 >   a[:foo] = 'bar'
 => "bar" 
2.0.0-p353 :006 > I18n.t(:foo)
 => {:foo=>"bar", :bar=>"bar"} 

所以,为了让问题更清楚 - 为什么将 a[:foo] 从 'foo' 更改为 'bar',会导致 I18n.t('foo.foo') ?

提前致谢!

之后

a = I18n.t(:foo)

引用a不保存副本,而是引用同一个哈希。更改 a 处的哈希值会修改 I18n.t(:foo) 处的相同哈希值。

这不是 I18n.t 的特殊行为,而是 Ruby 的正常行为。

> a
=> {:foo=>:bar, :baz=>:qux}
> b = a
=> {:foo=>:bar, :baz=>:qux}
> b[:foo] = 1
=> 1
> b
=> {:foo=>1, :baz=>:qux}
> a
=> {:foo=>1, :baz=>:qux}