如何在Ruby中编写条件lambda?
问题描述:
我想在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