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

时间:2015-03-26 20:28:44

标签: ruby-on-rails rails-i18n

今天就在我的上方。希望有人可以向我解释一下!

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

en:
  foo:
    foo: foo
    bar: bar

将I18n.t(:foo)的结果分配给局部变量,你得到一个哈希:

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

现在,在此Hash中更改键的值会导致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"} 

所以,要明确这个问题 - 为什么要改变[:foo]来自' foo'到' bar',导致I18n.t(' foo.foo')的变化?

提前致谢!

1 个答案:

答案 0 :(得分:0)

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}