如何在Ruby中编写条件lambda?

时间:2016-09-07 00:46:48

标签: ruby lambda syntax functional-programming

我想在Ruby中编写一个条件lambda。与我想写的Python等价的是:

even = (lambda x: x if x % 2 == 0 else 0)

我尝试在Ruby中编写它看起来像:

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

不幸的是,这不起作用。有什么方法可以解决这个问题吗?

5 个答案:

答案 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

答案 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)

您的语法错误:

  • 然后 -block出现在条件之后,而不是之前。
  • 然后 -block通过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也是一个表达式。