对如何在 ruby 中使用 lambda 进行选择感到困惑
Posted
技术标签:
【中文标题】对如何在 ruby 中使用 lambda 进行选择感到困惑【英文标题】:Confused on how to use lambda in ruby for select 【发布时间】:2014-09-30 01:28:06 【问题描述】:我正在使用 ruby,我只是在学习 lambda。我有一个对象数组,我想根据不同的条件从数组中选择某些对象,如下所示:
result = array.select|ar| ar.number > 4
我想将 select 的参数放入 lambda 表达式中,即我想将 |ar| ar.number > 4
放入 lambda 表达式中。我尝试了一些方法,包括:
result = array.selectlambda|g| g.number > 4
但这不起作用。
我也试过这个:
l = lambda g.number > 4
result = array.select|g| l
这也行不通。另外我需要将我的 lambda express 传递给一个函数,所以我认为我做的第一种方法不会奏效。我该怎么做?
【问题讨论】:
正如两个答案向您展示的那样,您缺少的部分是指定要在其内容中使用的块的参数。 【参考方案1】: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)
【讨论】:
【参考方案2】:要将 lambda(或 proc)作为块传递给方法,您必须使用特殊的 &syntax
:
result = array.select &mylambda
此外,您的 lambda(或 proc)必须指定它将接收和使用的参数的名称。因此:
l = lambda |g| g.number > 4
result = array.select &l
【讨论】:
【参考方案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 是proc
内的return
语句将导致执行从闭包和封闭方法(如果有)返回两个。。 p>
【讨论】:
“Proc”与“block”押韵,“lambda”是希腊语,就像“method”一样。 lambda 中的参数绑定和return
的行为类似于方法中的行为,而 proc 中的行为类似于块中的行为。以上是关于对如何在 ruby 中使用 lambda 进行选择感到困惑的主要内容,如果未能解决你的问题,请参考以下文章
在 Java 8 中使用 Lambda 对 ArrayList 进行排序
使用 lambda 在单个实例上重新定义单个 ruby 方法