我剛剛遇到一段有趣的代碼。我想確定它是ruby標準還是rails慣例。Ruby或ROR - 用'||'分隔的函數參數
redirect_to(session[:return_to] || users_path)
這可以防止在某些情況下redirect_to:back導致錯誤。在C++類似的東西會意味着一個函數與一個布爾參數。但在這裏它似乎以另一種方式工作 - 這種說法不是我想的。有人可以向我解釋它,並顯示這樣一個函數的示例定義,它將參數分隔爲'||'嗎?
再見
我剛剛遇到一段有趣的代碼。我想確定它是ruby標準還是rails慣例。Ruby或ROR - 用'||'分隔的函數參數
redirect_to(session[:return_to] || users_path)
這可以防止在某些情況下redirect_to:back導致錯誤。在C++類似的東西會意味着一個函數與一個布爾參數。但在這裏它似乎以另一種方式工作 - 這種說法不是我想的。有人可以向我解釋它,並顯示這樣一個函數的示例定義,它將參數分隔爲'||'嗎?
再見
布爾運算符如||
和&&
返回最後一條評估語句。
一個例子,
puts "hi" && "no"
上面會打印「不」,因爲這兩個字符串被認爲是「truthy」和「無」是所謂的最後一個值。
在這種情況下,程序員正在利用||
算子的短路特性。所以另一實例中,
puts "hi" || "no"
上面將輸出「喜」,因爲「喜」被認爲是truthy和或被短路的「hi」是從表達和叫做將返回的最後一個值。
您會在紅寶石中看到這種構造,尤其是與if
s。
a = if true
"A will be set to this string"
else
"This will never happen"
end
puts a #=> A will be set to this string
編輯:尼克提到,需要注意的是隻有nil
和false
被稱爲「falsy」治療是很重要的。一些有趣的例子
a = nil || "hi"
puts a #=> "hi"
a = false || "hi"
puts a #=> "hi"
在這兩種情況,因此「喜」被評估並返回(然後分配給)
a = Object.new || "hi"
puts a #=> <Object:0x10832420>
在這種情況下,第一個參數是「falsy」(以及用於任何其他值作爲第一個參數)Object.new是「真」,因此「hi」永遠不會被評估。在您的具體示例中,作者很可能測試了session[:return_to]
的存在(而非零)。這可能非常有用,但請始終記住,如果false
是有效值,則它可能無法正常工作。
我們應該補充說只有'nil'和'false'在紅寶石中被評估爲false。這種表達方式對於'try_this ||而言是慣用的fall_back_in_case_the_other_was_nil'。 –
同意。我已經擴大嘗試並傳達這一點。 – diedthreetimes
它調用redirect_to(session[:return_to])
如果session[:return_to]
是truthy(例如不nil
或false
)。
如果session[:return_to]
是falsy,然後調用redirect_to(users_path)
。
參見http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators#Logical_Or。
邏輯或是短路的,這意味着如果左邊是「真」或非零,則整個表達式的值是左邊,右邊是右邊從來沒有考慮過。所以如果session[:return_to]
不是零,它就是表達式的值。但是,如果它爲零,則表達式的值是右側的值,即值爲user_path
。
你甚至可以編寫像x || x = "foo"
這樣的東西,在這種情況下,x
只有在開頭爲零時才被重新分配,但如果它不爲零則不會被觸及。
至於功能上,它只是需要一個字符串,它並不關心你插什麼的說法。
這就是所謂的Short-Circuit Evaluation,它在許多編程語言
用簡單的英語是通用的,你的聲明說
「重定向到會話[:的return_to]如果它存在,如果沒有,重定向到users_path「
有點切線,但我覺得在這種情況下'or'操作符會更「正確」(http://avdi.org/devblog/2010/08/02/using-and-and-or -in-紅寶石/)。不回答這個問題,但我想我會把它放在那裏。 – Karl