誰かこの結果を説明してくれませんか?
(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 以降でのみ機能します。
とはいえ、 @falsetrufetch
の推奨に従って使用することを強くお勧めします。