def foo
true && return false
end
def bar
true and return false
end
foo
foo
方法導致語法錯誤。 bar
沒有。爲什麼?爲什麼Ruby表達式使用雙重&符號使用return語句導致語法錯誤
假設我想用返回語句(類似於某個常用的shell/bash表達式)評估單行程,這是推薦的方式嗎?還是有更好的方法?
def foo
true && return false
end
def bar
true and return false
end
foo
foo
方法導致語法錯誤。 bar
沒有。爲什麼?爲什麼Ruby表達式使用雙重&符號使用return語句導致語法錯誤
假設我想用返回語句(類似於某個常用的shell/bash表達式)評估單行程,這是推薦的方式嗎?還是有更好的方法?
旁註
值得注意的是,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)
最佳答案,因爲它回答了問題並給出了示例/用例。謝謝! –
通過運營商的關聯強度,
true && return false
評估到
(true && return) false
的
true && return
是有效的,但false
後它是無效的。你不能有兩個沒有任何內容的陳述排隊。
爲了補充說明,'和'的優先級低於'&&',所以@sawa指出,這就是'foo'不起作用的原因,但'bar'確實起作用,因爲'bar'就像你一樣評估期待它。 – Donovan
因爲&&
運算符優先級的,下面一行
true && return false
評估爲
(true && return) false
不有道理。爲了執行你的代碼,你需要使用
def foo
true && (return false)
end
and
不會遭受同樣的問題,因爲and
has lower precedence than &&
的。
如果有需要縮減的語句中使用
def foo
return false if true
end
def bar
return false if true
end
回報是不是一個函數:)因此沒有意義說
when true and return is ok send a false
我懷疑是解釋計算表達式:((真&&返程)假) –
下面的兩個答案說這是因爲優先級或關聯強度('&&'>'和'),但任何人都可以解釋爲什麼'返回'落在他們之間?爲什麼'return'不管是什麼都總是接受它後面的參數/值? – iamnotmaynard
@iamnotmaynard如果我的答案是你提到的兩個答案之一,那麼你正在解釋錯誤的答案。 (對於Simone Carletti的回答也是如此。)我並不是說'&&'優先於'和'。我(隱含地使用這個例子)說'&&'優先於'return'的方法調用(它接受它的參數)。 – sawa