2011-03-09 71 views
0

爲什麼這兩個語句不等價?Ruby三元運算符

  1. defined? foo ? foo << "bar" : foo = ["bar"]
  2. if (defined? foo) then foo << "bar" else foo = ["bar"] end

首先聲明:

irb(main):001:0> defined? foo ? foo << "bar" : foo = ["bar"] 
=> nil 
irb(main):002:0> foo 
=> nil 
irb(main):003:0> defined? foo ? foo << "bar" : foo = ["bar"] 
=> "expression" 
irb(main):004:0> foo 
=> ["bar"] 

其次聲明:

irb(main):001:0> if (defined? foo) then foo << "bar" else foo = ["bar"] end 
=> ["bar"] 
irb(main):002:0> foo 
=> ["bar"] 
irb(main):003:0> if (defined? foo) then foo << "bar" else foo = ["bar"] end 
=> ["bar", "bar"] 
irb(main):004:0> foo 
=> ["bar", "bar"] 

這些會議是在JRuby 1。 5.0(應該相當於原生的Ruby 1.8.7)。我看到與本地ruby 1.9.1略有不同的行爲:即使在運行兩次時,語句#1也不會定義foo

回答

5

因爲第一次評估爲:

defined?(foo ? foo << "bar" : foo = ["bar"]) 

爲什麼返回零,我不知道......

解決方法是簡單地做:

(defined? foo) ? foo << "bar" : foo = ["bar"] 
+0

謝謝,我應該想到的! – dbyrne

+0

「爲什麼這會返回零,我不知道..」:當我在IRB控制檯I中輸入問題「defined?foo?foo <<」bar「:foo = [」bar「]」的第一行時得到「表達」而不是「無」。我認爲提問者犯了一個錯誤。 –

+2

@Mörre它取決於你使用的是什麼版本的ruby。你可能正在使用紅寶石1.9。 – dbyrne

1
  1. 定義? foo? FOO < < 「欄」:富= [ 「酒吧」]
  2. 如果(定義FOO?)然後foo的< < 「bar」 的其他富= [ 「酒吧」]端

在任一情況,你的代碼可能會被簡化。根據上面的兩個樣本,它看起來像會有某種封閉的循環。而不是試圖創建foo裏面並初始化到第一['bar'],我會做一些事情,如:

foo = [] 
... start some loop ... 
    foo << bar 
... end some loop ... 

或者,如果你不喜歡從那裏你追加到數組分手初始化:

(foo ||= []) << "bar" 

第二種方式有點「Perlish」,但它遠遠沒有從Ruby方式變得無法解讀。