2

谁能向我解释一下这个结果:

(trad = {foo: "Foo", bar:"Bar"}).has_key? :foo ? trad[:foo] : :foo
=> false

我希望它会返回:

=> "Foo"
4

2 回答 2

8
(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
于 2013-09-26T17:20:10.433 回答
1

由于缺少括号,应用程序丢失了......

(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 的建议使用。

于 2013-09-26T18:47:42.883 回答