2011-03-09 19 views
0

なぜこれら2つの文は等価ではありませんか? defined? foo ? foo << "bar" : foo = ["bar"] Ruby三項演算子

  1. 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に相当するはずです)。ネイティブルビ1.9.1と少し違った動作をします:文#1は、それを2回実行しても決してfooを定義しません。

答えて

5

への最初の評価されるため:

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

nilを返すなぜ、私は見当もつかない...

修正は何をするだけである:

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

ありがとう、私はそれを考えていたはずです! – dbyrne

+0

"なぜnilが返されないのですか?私は手がかりがありません。":irbコンソールで "foo?foo <<" bar ":foo = [" bar "]という質問の最初の行に入力すると、 "式"を得て、 "無し"にしないでください。質問者の間違いがあったと思います。 –

+2

@Mörre使用しているルビのバージョンによって異なります。 Ruby 1.9を使用している可能性があります。 – dbyrne

1
  1. が定義されていますか? foo? FOO < < "バー":いずれの場合もFOO = [ "バー"]
  2. 場合(?定義FOO)その後のfoo < < "バー" 他FOO = [ "バー"]端

おそらく、あなたのコードは単純化することができます。上記の2つのサンプルに基づいて、何らかの囲みループがあるように見えます。あなたは配列に追加し、そこから初期化子を壊す好きではない場合、

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

または::それは内部fooを作成しようと最初['bar']に初期化するのではなく、私のような何かをしたい

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

この2番目の方法は少し "Perlish"ですが、それはRubyの方法から解読不能になっていません。