2013-09-26 23 views

回答

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 
+0

非常清楚。謝謝。 (哈希#取得更好,謝謝你) – Pol0nium

+2

很好的調用'哈希#提取'。 – tadman

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 AM當你的編碼合作伙伴因爲他正在打電話而收到有關係統中斷的電話,並且深入到代碼中時,該分配可能很難找到。

在代碼審查,我建議這樣的事情在其他:

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

注:關於Ruby這隻能1.9+。

這一切都說,我強烈建議使用fetch作爲recommended by @falsetru

相關問題