为什么我会在三元条件下得到意想不到的结果?

Pol*_*ium 2 ruby

任何人都可以向我解释这个结果:

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

我希望它能回归:

=> "Foo"
Run Code Online (Sandbox Code Playgroud)

fal*_*tru 8

(trad = {foo: "Foo", bar:"Bar"}).has_key? :foo ? trad[:foo] : :foo
Run Code Online (Sandbox Code Playgroud)

就好像:

(trad = {foo: "Foo", bar:"Bar"}).has_key? (:foo ? trad[:foo] : :foo)
Run Code Online (Sandbox Code Playgroud)

: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"
Run Code Online (Sandbox Code Playgroud)

Hash#fetch(key, default) 似乎更合适:

>> {foo: "Foo", bar:"Bar"}.fetch(:foo, :foo)
=> "Foo"
>> {foo: "Foo", bar:"Bar"}.fetch(:baz, :baz)
=> :baz
Run Code Online (Sandbox Code Playgroud)

  • 好好打电话给`Hash #fetch`. (2认同)