困惑如何在ruby中使用lambda进行选择

时间:2014-08-06 23:10:50

标签: ruby lambda

我正在和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传递给一个函数,所以我不认为我做的第一种方式会有效。我该怎么做?

3 个答案:

答案 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 lambdalambda在传递的参数太少或太多时会抛出错误,而proc会忽略它。另一个subtle differencereturn内的proc语句将导致执行从闭包返回两者和封闭方法(如果有的话。