对如何在 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​​ 方法

如何使用 linq lambda 对包含数值的 varchar 列进行排序到实体

如何在Ruby中按降序对数组进行排序

Ruby 中的 proc 和 lambda 有啥区别?

lambda表达式和闭包