2013-12-20 51 views
4
def foo 
    true && return false 
end 

def bar 
    true and return false 
end 

foofoo方法導致語法錯誤。 bar沒有。爲什麼?爲什麼Ruby表達式使用雙重&符號使用return語句導致語法錯誤

假設我想用返回語句(類似於某個常用的shell/bash表達式)評估單行程,這是推薦的方式嗎?還是有更好的方法?

+0

我懷疑是解釋計算表達式:((真&&返程)假) –

+2

下面的兩個答案說這是因爲優先級或關聯強度('&&'>'和'),但任何人都可以解釋爲什麼'返回'落在他們之間?爲什麼'return'不管是什麼都總是接受它後面的參數/值? – iamnotmaynard

+0

@iamnotmaynard如果我的答案是你提到的兩個答案之一,那麼你正在解釋錯誤的答案。 (對於Simone Carletti的回答也是如此。)我並不是說'&&'優先於'和'。我(隱含地使用這個例子)說'&&'優先於'return'的方法調用(它接受它的參數)。 – sawa

回答

4

旁註

值得注意的是,and&&並不等同。

and是流量控制運算符,而&&是布爾運算符。有什麼不同?

差異的一個示例,使用and,您可以分配值。

value = nil and value/42 

,如果你嘗試過如下

value = nil && value/42 

原始的問題1

假設我要評估一個return語句單行(類似於這樣會失敗某些>通常使用的shell/bash表達式),這是推薦的方式嗎?還是有更多推薦的方法?

我一直看到的Ruby這樣做的方式是這樣的:

value if conditional 

如果條件得到滿足和nil否則這將返回值。如果這是功能中的最後一個命令,則不需要return語句!

如果您使用此功能提前退出功能,我更喜歡使用unless。例如...

return unless arguments_are_valid 

原始的問題2

foo的方法會導致語法錯誤。酒吧沒有。爲什麼?

這是一個運營商優先權的問題。請參閱下面的示例,瞭解如何評估它們。

(true && return) false 
(true) and (return false) 
+0

最佳答案,因爲它回答了問題並給出了示例/用例。謝謝! –

6

通過運營商的關聯強度,

true && return false 

評估到

(true && return) false 

true && return 

是有效的,但false後它是無效的。你不能有兩個沒有任何內容的陳述排隊。

+0

爲了補充說明,'和'的優先級低於'&&',所以@sawa指出,這就是'foo'不起作用的原因,但'bar'確實起作用,因爲'bar'就像你一樣評估期待它。 – Donovan

3

因爲&&運算符優先級的,下面一行

true && return false 

評估爲

(true && return) false 

不有道理。爲了執行你的代碼,你需要使用

def foo 
    true && (return false) 
end 

and不會遭受同樣的問題,因爲and has lower precedence than &&的。

0

如果有需要縮減的語句中使用

def foo 
    return false if true 
end 

def bar 
    return false if true 
end 

回報是不是一個函數:)因此沒有意義說

when true and return is ok send a false