2016-09-07 71 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也是一个表达式。