我想在Ruby中编写一个条件lambda。与我想写的Python等价的是:
even = (lambda x: x if x % 2 == 0 else 0)
我尝试在Ruby中编写它看起来像:
even = -> (x) {x if x % 2 == 0 else 0}
不幸的是,这不起作用。有什么方法可以解决这个问题吗?
答案 0 :(得分:3)
这里有几种选择来表达这一点。长篇是这样的:
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
答案 1 :(得分:2)
Ruby的三元运算符具有此语法
x % 2 == 0 ? x : 0
答案 2 :(得分:1)
你甚至不需要条件。
p = ->(x) { x*(1-x%2) }
p.call(4) #=> 4
p.call(5) #=> 0
注意可以通过多种方式调用proc:
p[4] #=> 4
p.(4) #=> 4
p.yield(4) #=> 4
p === 4 #=> 4
p(4) #=> 4
最后一个可能是陈旧的。
答案 3 :(得分:1)
语法错误。你可以这样写:
even = -> (x) {if x % 2 == 0; x; else; 0; end}
但是,对于这样的单行,更常见的是使用三元?:运算符,正如其他人在此主题中所建议的那样。
答案 4 :(得分: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
也是一个表达式。