谁能向我解释一下这个结果:
(trad = {foo: "Foo", bar:"Bar"}).has_key? :foo ? trad[:foo] : :foo
=> false
我希望它会返回:
=> "Foo"
谁能向我解释一下这个结果:
(trad = {foo: "Foo", bar:"Bar"}).has_key? :foo ? trad[:foo] : :foo
=> false
我希望它会返回:
=> "Foo"
(trad = {foo: "Foo", bar:"Bar"}).has_key? :foo ? trad[:foo] : :foo
就好像:
(trad = {foo: "Foo", bar:"Bar"}).has_key? (:foo ? trad[:foo] : :foo)
:foo ? trad[:foo] : :foo
被评估为"Foo"
因为:foo
被视为真值。
(trad = {foo: "Foo", bar:"Bar"}).has_key? "Foo"
产量false
,因为没有“Foo”键。
使用以下(用括号覆盖优先级)来获得预期的结果:
>> ((trad = {foo: "Foo", bar:"Bar"}).has_key? :foo) ? trad[:foo] : :foo
=> "Foo"
Hash#fetch(key, default)
似乎更合适:
>> {foo: "Foo", bar:"Bar"}.fetch(:foo, :foo)
=> "Foo"
>> {foo: "Foo", bar:"Bar"}.fetch(:baz, :baz)
=> :baz
由于缺少括号,应用程序丢失了......
(trad = {foo: "Foo", bar:"Bar"}).has_key? :foo ? trad[:foo] : :foo # => false
(trad = {foo: "Foo", bar:"Bar"}).has_key?(:foo) ? trad[:foo] : :foo # => "Foo"
我会小心编写这样的代码:
(trad = {foo: "Foo", bar:"Bar"})
这不是惯用的,所以使用:
trad = {foo: "Foo", bar:"Bar"}
trad.has_key?...
原因是,在恐慌的时候,比如在凌晨 2 点 45 分,当你的编码伙伴接到一个关于系统中断的电话时,因为他正在待命,并且潜入代码,这个任务可能很难找到。
在代码审查中,我会建议这样的事情:
trad = {foo: "Foo", bar:"Bar"}
trad.has_key?(:foo) ? trad[:foo]
: :foo # => "Foo"
注意:这只适用于 Ruby 1.9+。
综上所述,我强烈建议fetch
按照@falsetru 的建议使用。