你可能对下面的Ruby速记很熟悉(a
是一个数组):
a.map(&:method)
例如,在irb中尝试执行以下操作:
>> 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
方法。
我的问题是:你能为方法调用提供参数吗?如果是这样,又是如何做到的呢?
例如,如何转换以下语法
a = [1,3,5,7,9]
a.map {|x| x + 2}
&:
语法吗?
我并不是说&:
语法更好。我只对使用带参数的&:
语法的机制感兴趣。
我假设您知道+
是Integer类上的一个方法。您可以在irb中尝试以下操作:
>> a=1
=> 1
>> a+(1)
=> 2
>> a.send(:+, 1)
=> 2
发布于 2014-05-16 21:17:19
对于您的示例,可以使用a.map(&2.method(:+))
。
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)>
以下是它的工作原理:
[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?行驶。
发布于 2014-05-16 21:13:18
正如你链接的帖子所证实的那样,a.map(&:class)
不是a.map {|x| x.class}
的缩写,而是a.map(&:class.to_proc)
的缩写。
这意味着在&
操作符之后的任何地方都会调用to_proc
。
所以你可以直接给它一个Proc
:
a.map(&(Proc.new {|x| x+2}))
我知道这很可能与你的问题的目的背道而驰,但我看不出有任何其他方法可以绕过它-这不是你指定要调用的方法,你只是传递给它一些响应to_proc
的东西。
发布于 2018-08-29 22:04:33
在我看来,enumerables还有另一个本机选项,它只适用于两个参数。类Enumerable
具有方法with_object
,该方法随后返回另一个Enumerable
。
因此,您可以使用每个项目和对象作为参数来调用方法的&
运算符。
示例:
a = [1,3,5,7,9]
a.to_enum.with_object(2).map(&:+) # => [3, 5, 7, 9, 11]
在你需要更多参数的情况下,你应该重复这个过程,但在我看来这很丑陋:
a = [1,3,5,7,9]
a.to_enum.with_object(2).map(&:+).to_enum.with_object(5).map(&:+) # => [8, 10, 12, 14, 16]
https://stackoverflow.com/questions/23695653
复制相似问题