2016-09-07 103 views
1

我想在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} 

不幸的是,這是行不通的。有沒有什麼辦法解決這一問題?

回答

3

你這裏有幾種選擇來表達這一點。長格式是這樣的:

if (x % 2 == 0) 
    x 
else 
    0 
end 

注意的後ifunless不能有一個次要條件等else。您需要使用完整的表單。

如果你想要一個短版,您可以使用三元運算符

(x % 2 == 0) ? x : 0 

什麼,你也可以做的是這樣的:

(x % 2 == 0) and x or 0 

正如其他人所觀察到的,有一個名爲even?方法它爲你模數,所以可以進一步摺疊:

x.even? ? x : 0 
2

Ruby的三元操作的語法如下

x % 2 == 0 ? x : 0 
+1

你也可以寫'lambda do | x |如果x.even?然後x else 0 end end'。 Ruby中的許多選項;擦洗你的大腦清潔TIOOWTDI:P – Amadan

1

你甚至不需要一個條件。

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 

最後的這些可能是過時的。

0

語法錯誤。你可以寫這樣的:

even = -> (x) {if x % 2 == 0; x; else; 0; end} 

然而,對於這樣的俏皮話,但更常見的是使用三元運算符?:,其他在這個線程建議。

0

你的語法是錯誤的:

  • 然後 - 阻塞自帶的條件之後,而不是之前它。
  • 然後塊通過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也是一個表達式。