为什么I18n翻译在具有选定翻译关键字的局部变量更改时发生更改



这是我今天的首要任务。希望有人能向我解释!

假设您有一个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('fo.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("fo.foo")的更改?

提前感谢!

之后

a = I18n.t(:foo)

引用a不包含副本,但引用了相同的Hash。改变CCD_ 2处的散列修改CCD_ 3处的相同散列。

这不是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}

最新更新