我想在Ruby中編寫條件lambda。 Python的當量想什麼,我寫的是:如何在Ruby中編寫條件lambda?
even = (lambda x: x if x % 2 == 0 else 0)
我試圖用Ruby寫這個樣子:
even = -> (x) {x if x % 2 == 0 else 0}
不幸的是,這是行不通的。有沒有什麼辦法解決這一問題?
我想在Ruby中編寫條件lambda。 Python的當量想什麼,我寫的是:如何在Ruby中編寫條件lambda?
even = (lambda x: x if x % 2 == 0 else 0)
我試圖用Ruby寫這個樣子:
even = -> (x) {x if x % 2 == 0 else 0}
不幸的是,這是行不通的。有沒有什麼辦法解決這一問題?
你這裏有幾種選擇來表達這一點。長格式是這樣的:
if (x % 2 == 0)
x
else
0
end
注意的後if
或unless
不能有一個次要條件等else
。您需要使用完整的表單。
如果你想要一個短版,您可以使用三元運算符:
(x % 2 == 0) ? x : 0
什麼,你也可以做的是這樣的:
(x % 2 == 0) and x or 0
正如其他人所觀察到的,有一個名爲even?
方法它爲你模數,所以可以進一步摺疊:
x.even? ? x : 0
Ruby的三元操作的語法如下
x % 2 == 0 ? x : 0
你甚至不需要一個條件。
p = ->(x) { x*(1-x%2) }
p.call(4) #=> 4
p.call(5) #=> 0
注特效可以稱爲以多種方式:
p[4] #=> 4
p.(4) #=> 4
p.yield(4) #=> 4
p === 4 #=> 4
p(4) #=> 4
最後的這些可能是過時的。
語法錯誤。你可以寫這樣的:
even = -> (x) {if x % 2 == 0; x; else; 0; end}
然而,對於這樣的俏皮話,但更常見的是使用三元運算符?:,其他在這個線程建議。
你的語法是錯誤的:
then
關鍵字,分號或換行符與條件分開。end
關鍵字結束。因此,任何以下是有效的:
# idiomatic:
if x % 2 == 0 then x else 0 end
# idiomatic:
if x % 2 == 0
x
else
0
end
# non-idiomatic:
if x % 2 == 0; x else 0 end
# non-idiomatic:
if x % 2 == 0 then
x
else
0
end
# non-idiomatic:
if x % 2 == 0
x else 0 end
# … and many other non-idiomatic variations
Ruby也有一個條件運算符:
x % 2 ? x : 0
但我個人覺得它難看且無法讀取。它也有不同的優先級比條件表達式,這可能是一些令人驚訝的。 (在StackOverflow中見證關於條件運算符的相同問題的無數變體)。而且它完全沒有必要:在C中,其中if
是一個條件語句,條件運算符是必需的,因爲它是一個表達式。在Ruby中,無論如何,一切都是表達式,沒有語句,所以當然if
也是一個表達式。
你也可以寫'lambda do | x |如果x.even?然後x else 0 end end'。 Ruby中的許多選項;擦洗你的大腦清潔TIOOWTDI:P – Amadan