我正在和ruby一起工作,我只是在学习lambdas。我有一个对象数组,我想根据不同的条件从数组中选择某些对象:
result = array.select{|ar| ar.number > 4}
我想将select的参数放入lambda表达式,即我想将|ar| ar.number > 4
放入lambda表达式中。我尝试过一些事情,包括:
result = array.select{lambda{|g| g.number > 4}}
但这不起作用。
我也试过这个:
l = lambda {g.number > 4}
result = array.select{|g| l}
这也行不通。另外我需要将我的lambda express传递给一个函数,所以我不认为我做的第一种方式会有效。我该怎么做?
答案 0 :(得分:12)
Enumerable#select
需要一个块,而不是lambda。所以,你需要传递一个块。
值得庆幸的是,有一个运算符会将lambda或proc(事实上任何响应to_proc
的内容)转换为块:一元前缀&
运算符,仅在参数中有效列表(将proc转换为块的位置)和参数列表(将块转换为proc)。
所以,如果你有一个lambda l
,你可以将它作为一个块传递给方法foo
,如下所示:
foo(&l)
你的第二个问题是你的lambda不接受任何参数,但是传递给select
的块接受一个参数,所以你需要用一个参数创建你的lambda:
l = lambda {|el| el.number > 4 }
# I prefer this syntax, though:
l = -> el { el.number > 4 }
把所有这些放在一起,我们有:
result = array.select(&l)
答案 1 :(得分:6)
要将lambda(或proc)作为块传递给方法,必须使用特殊的&syntax
:
result = array.select &mylambda
此外,您的lambda(或proc)必须指定它将接收和使用的参数的名称。因此:
l = lambda { |g| g.number > 4}
result = array.select &l
答案 2 :(得分:3)
干净的方法是使用Ruby的"stabby" lambda syntax:
l = ->(ar) { ar.number > 4 }
result = array.select(&l)
更多"传统"定义lambda
的方式是这样的:
l = lambda { |ar| ar.number > 4 }
result = array.select(&l)
请注意,您不必严格使用lambda
;你也可以使用proc
*:
p = proc { |ar| ar.number > 4 }
result = array.select(&p)
* main difference between proc and lambda是lambda
在传递的参数太少或太多时会抛出错误,而proc
会忽略它。另一个subtle difference是return
内的proc
语句将导致执行从闭包返回两者和封闭方法(如果有的话。