2012-04-04 52 views
2

我只是想知道,這句法記載:條件||提高( 「錯誤」)

1 > 2 || raise("error") 

我試圖用它作爲條件:

1 > 2 || p "test" 

,但它不工作:

SyntaxError: (irb):9: syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' 
1 > 2 || p "test" 
      ^
     from C:/Ruby193/bin/irb:12:in `<main>' 
+0

你是什麼意思「不起作用」?發生了什麼,你期望會發生什麼? – 2012-04-04 17:27:58

+0

我已更新我的問題。 – demas 2012-04-04 17:29:43

+0

1> 2 ||提高「錯誤」不起作用 – Falcon 2012-04-04 17:32:29

回答

7

你有什麼不工作,因爲你需要括號:

1 > 2 || p("test") 

注意or (and and) has a different precedence than &&/||,因此將沒有括號工作(和什麼你做更有意義的語義):

1 > 2 or p "test" 

如將unless

p "test" unless 1 > 2 
5

這只是一種內聯的方式來說「如果條件是錯誤會引發錯誤」。 ||只是一個常見的OR運算符,並且使用short-circuit evaluation來評估表達式。然而,爲了清晰起見,我寧願這樣:

raise("error") unless 1 > 2 
4

兩個處決做的工作,問題是括號對p排除。從運行代碼IRB

ruby-1.8.7-p302 :003 > 1 > 2 || raise("error") 
RuntimeError: error 
    from (irb):3 

通過添加 「測試」 ,呼叫按預期工作:

ruby-1.8.7-p302 :004 > 1 > 2 || p("test") 
"test" 
0

什麼你試圖在這裏做到的是控制流動而不是條件邏輯。這對於條件邏輯來說是無效的。適當的控制流程將使用「和」和「或」構造。這是他們的目的,而不是,正如往往錯誤地假設,語法糖替代& &和||條件操作符。它們是不同的,有不同的評估順序,應該用在正確的地方。例子:

1 > 2 or p 'no it is not' 
2 > 1 and return 
instance.exists? or not_found! 
instance && instance.success? or raise FailureException, 'missing or unsuccessful' 

從本質上講,如果你想讀從語句真或假,使用& &和||。如果您嘗試基於條件評估執行代碼路徑,請使用和和或。