我正在和ruby一起工作,我只是在学习lambdas.我有一个对象数组,我想根据不同的条件从数组中选择某些对象,如下所示:
result = array.select{|ar| ar.number > 4}
Run Code Online (Sandbox Code Playgroud)
我想把select的参数放到一个lambda表达式中,即我想放入|ar| ar.number > 4一个lambda表达式.我尝试了一些事情,包括:
result = array.select{lambda{|g| g.number > 4}}
Run Code Online (Sandbox Code Playgroud)
但这不起作用.
我也试过这个:
l = lambda {g.number > 4}
result = array.select{|g| l}
Run Code Online (Sandbox Code Playgroud)
这也行不通.另外我需要将我的lambda express传递给一个函数,所以我不认为我做的第一种方式会有效.我该怎么做?
Jör*_*tag 12
Enumerable#select需要一个块,而不是一个lambda.所以,你需要传递一个块.
值得庆幸的是,有一个运算符将lambda或proc(实际上是响应的任何东西to_proc)转换为一个块:一元前缀&运算符,它只在参数列表中有效(将proc转换为块)并且在参数列表(将块转换为proc的位置).
所以,如果你有一个lambda l,你可以将它作为一个块传递给方法,foo如下所示:
foo(&l)
Run Code Online (Sandbox Code Playgroud)
你的第二个问题是你的lambda不接受任何参数,但传递给的块select接受一个参数,所以你需要用一个参数创建你的lambda:
l = lambda {|el| el.number > 4 }
# I prefer this syntax, though:
l = -> el { el.number > 4 }
Run Code Online (Sandbox Code Playgroud)
把所有这些放在一起,我们有:
result = array.select(&l)
Run Code Online (Sandbox Code Playgroud)
要将lambda(或proc)作为块传递给方法,必须使用特殊的&syntax:
result = array.select &mylambda
Run Code Online (Sandbox Code Playgroud)
此外,您的lambda(或proc)必须指定它将接收和使用的参数的名称.从而:
l = lambda { |g| g.number > 4}
result = array.select &l
Run Code Online (Sandbox Code Playgroud)
一种简洁的方法是使用 Ruby 的“stabby”lambda 语法:
l = ->(ar) { ar.number > 4 }
result = array.select(&l)
Run Code Online (Sandbox Code Playgroud)
定义 a 的更“传统”方式lambda是这样的:
l = lambda { |ar| ar.number > 4 }
result = array.select(&l)
Run Code Online (Sandbox Code Playgroud)
请注意,您并不严格需要使用lambda; 你也可以使用proc*:
p = proc { |ar| ar.number > 4 }
result = array.select(&p)
Run Code Online (Sandbox Code Playgroud)
* proc 和 lambda 之间的主要区别是lambda当传递的参数太少或太多时会抛出错误,而 whileproc会忽略它。另一个细微的区别是returna 内的语句将导致执行从闭包和封闭方法(如果有)proc返回。
| 归档时间: |
|
| 查看次数: |
4659 次 |
| 最近记录: |