2010-04-01 154 views
1

我確定我在這裏失去了一些東西,但沒有更少。爲什麼這個Ruby'if'不像預期的那樣行爲?

foo['bar'] = nil 

if(foo['bar'] == nil) 
    puts "foo bar is nil :(" 

但是,什麼都沒有發生?有什麼想法嗎?

+0

問題是紅寶石本身(不會進入細節),但標記爲答案,因爲那裏有一些非常好的迴應。 – 2010-04-01 21:22:08

回答

10

你需要一個end語句關閉if

if(foo['bar'] == nil) 
    puts "foo bar is nil :(" 
end 

注意,有用於檢查nil?方法,如果事情是nil和周圍的條件括號內是沒有必要的,因此會更地道紅寶石寫:

if foo['bar'].nil? 
    puts "foo bar is nil :(" 
end 

作爲Arkku評論的,一個單一的線if可以簡明地寫成:

puts "foo bar is nil :(" if foo['bar'].nil? 

哪個更好取決於上下文(例如,你想強調一下情況還是強調如果條件是真的會發生什麼情況)以及一定的個人偏好。但是,作爲一個例子,您可能會在方法開始時提供警戒條件,例如,

raise "bar needed" if foo['bar'].nil? 
+3

+1,但作爲附加說明,在Ruby中,爲了簡潔起見,提問者可能想要的單行'if'可以寫成'puts'nil'if foo ['bar']。nil?' – Arkku 2010-04-01 15:51:15

+0

@ Arkku是的,我會更新答案以包含完整性。 – mikej 2010-04-01 17:29:17

1
irb(main):002:0> foo = {} 
=> {} 
irb(main):003:0> foo['bar'] = nil 
=> nil 
irb(main):004:0> foo['bar'] 
=> nil 
irb(main):005:0> if foo['bar'] == nil 
irb(main):006:1> puts "foo bar nil" 
irb(main):007:1> end 
foo bar nil 
=> nil 
2

零是把它酷似一個條件爲假。所以你不需要測試,如果你的變量真的是零。

foo = {} 
foo['bar'] = nil 
puts "foo bar is nil :(" unless foo['bar'] 
puts "foo bar is nil :(" if !foo['bar'] 

在ruby中,只有nil和false在條件語句中返回false。

+1

當然,有時可能需要區分零和假,例如,這裏印刷的信息對於錯誤是不正確的,聲稱它是零。 – Arkku 2010-04-01 15:49:56

+1

「nil == false」是誤導性的,因爲它們不相等。 Ruby將nil視爲錯誤的條件測試結果。 – 2010-04-01 16:28:54

+0

是的,你是對的太多了 – shingara 2010-04-01 16:45:38

相關問題