2011-08-03 40 views
0

我剛剛遇到一段有趣的代碼。我想確定它是ruby標準還是rails慣例。Ruby或ROR - 用'||'分隔的函數參數

redirect_to(session[:return_to] || users_path) 

這可以防止在某些情況下redirect_to:back導致錯誤。在C++類似的東西會意味着一個函數與一個布爾參數。但在這裏它似乎以另一種方式工作 - 這種說法不是我想的。有人可以向我解釋它,並顯示這樣一個函數的示例定義,它將參數分隔爲'||'嗎?

再見

+0

有點切線,但我覺得在這種情況下'or'操作符會更「正確」(http://avdi.org/devblog/2010/08/02/using-and-and-or -in-紅寶石/)。不回答這個問題,但我想我會把它放在那裏。 – Karl

回答

6

布爾運算符如||&&返回最後一條評估語句。

一個例子,

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 

編輯:尼克提到,需要注意的是隻有nilfalse被稱爲「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是有效值,則它可能無法正常工作。

+0

我們應該補充說只有'nil'和'false'在紅寶石中被評估爲false。這種表達方式對於'try_this ||而言是慣用的fall_back_in_case_the_other_was_nil'。 –

+0

同意。我已經擴大嘗試並傳達這一點。 – diedthreetimes

1

邏輯或是短路的,這意味着如果左邊是「真」或非零,則整個表達式的值是左邊,右邊是右邊從來沒有考慮過。所以如果session[:return_to]不是零,它就是表達式的值。但是,如果它爲零,則表達式的值是右側的值,即值爲user_path

你甚至可以編寫像x || x = "foo"這樣的東西,在這種情況下,x只有在開頭爲零時才被重新分配,但如果它不爲零則不會被觸及。

至於功能上,它只是需要一個字符串,它並不關心你插什麼的說法。

3

這就是所謂的Short-Circuit Evaluation,它在許多編程語言

用簡單的英語是通用的,你的聲明說

「重定向到會話[:的return_to]如果它存在,如果沒有,重定向到users_path「