首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >你能为Ruby中的map(&:method)语法提供参数吗?

你能为Ruby中的map(&:method)语法提供参数吗?
EN

Stack Overflow用户
提问于 2014-05-16 21:01:31
回答 8查看 44.4K关注 0票数 129

你可能对下面的Ruby速记很熟悉(a是一个数组):

代码语言:javascript
复制
a.map(&:method)

例如,在irb中尝试执行以下操作:

代码语言:javascript
复制
>> a=[:a, 'a', 1, 1.0]
=> [:a, "a", 1, 1.0]
>> a.map(&:class)
=> [Symbol, String, Fixnum, Float]

语法a.map(&:class)a.map {|x| x.class}的简写形式。

在"What does map(&:name) mean in Ruby?“中阅读有关此语法的更多信息。

通过语法&:class,您可以为每个数组元素调用class方法。

我的问题是:你能为方法调用提供参数吗?如果是这样,又是如何做到的呢?

例如,如何转换以下语法

代码语言:javascript
复制
a = [1,3,5,7,9]
a.map {|x| x + 2}

&:语法吗?

我并不是说&:语法更好。我只对使用带参数的&:语法的机制感兴趣。

我假设您知道+是Integer类上的一个方法。您可以在irb中尝试以下操作:

代码语言:javascript
复制
>> a=1
=> 1
>> a+(1)
=> 2
>> a.send(:+, 1)
=> 2
EN

回答 8

Stack Overflow用户

发布于 2014-05-16 21:17:19

对于您的示例,可以使用a.map(&2.method(:+))

代码语言:javascript
复制
Arup-iMac:$ pry
[1] pry(main)> a = [1,3,5,7,9]
=> [1, 3, 5, 7, 9]
[2] pry(main)> a.map(&2.method(:+))
=> [3, 5, 7, 9, 11]
[3] pry(main)> 

以下是它的工作原理:

代码语言:javascript
复制
[3] pry(main)> 2.method(:+)
=> #<Method: Fixnum#+>
[4] pry(main)> 2.method(:+).to_proc
=> #<Proc:0x000001030cb990 (lambda)>
[5] pry(main)> 2.method(:+).to_proc.call(1)
=> 3

2.method(:+)提供了一个Method对象。然后,在2.method(:+)上,&实际上是一个调用#to_proc方法的方法,这使得它成为Proc对象。然后沿着What do you call the &: operator in Ruby?行驶。

票数 53
EN

Stack Overflow用户

发布于 2014-05-16 21:13:18

正如你链接的帖子所证实的那样,a.map(&:class)不是a.map {|x| x.class}的缩写,而是a.map(&:class.to_proc)的缩写。

这意味着在&操作符之后的任何地方都会调用to_proc

所以你可以直接给它一个Proc

代码语言:javascript
复制
a.map(&(Proc.new {|x| x+2}))

我知道这很可能与你的问题的目的背道而驰,但我看不出有任何其他方法可以绕过它-这不是你指定要调用的方法,你只是传递给它一些响应to_proc的东西。

票数 13
EN

Stack Overflow用户

发布于 2018-08-29 22:04:33

在我看来,enumerables还有另一个本机选项,它只适用于两个参数。类Enumerable具有方法with_object,该方法随后返回另一个Enumerable

因此,您可以使用每个项目和对象作为参数来调用方法的&运算符。

示例:

代码语言:javascript
复制
a = [1,3,5,7,9]
a.to_enum.with_object(2).map(&:+) # => [3, 5, 7, 9, 11]

在你需要更多参数的情况下,你应该重复这个过程,但在我看来这很丑陋:

代码语言:javascript
复制
a = [1,3,5,7,9]
a.to_enum.with_object(2).map(&:+).to_enum.with_object(5).map(&:+) # => [8, 10, 12, 14, 16]
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23695653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档