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 以降でのみ機能します。

とはいえ、 @falsetrufetchの推奨に従って使用することを強くお勧めします。

于 2013-09-26T18:47:42.883 に答える