如何将一个parameter passing给array.map的快捷方式?

给定以下数组a

 a = [1, 2, 3, 4, 5] 

我该怎么做:

 a.map { |num| num + 1 } 

使用简短的符号:

 a.map(&:+ 1) 

要么:

 a.map(&:+ 2) 

其中1和2是参数?

你不能这样做。 &运算符是将符号转换为特效。

 a = [1, 2, 3, 4, 5] puts a.map(&:to_s) # prints array of strings puts a.map(&:to_s2) # error, no such method `to_s2`. 

&to_proc的简写:

 def to_proc proc { |obj, *args| obj.send(self, *args) } end 

它创build并返回新的过程。 如您所见,您无法将任何parameter passing给此方法。 你只能调用生成的过程。

在这种情况下,你可以做

 a.map(&1.method(:+)) 

但只是因为1 + x通常与x + 1相同。

这是一个表演背景下的这种做法的讨论。

你不能用map来做。 但是看看Facets的Enumerable#map_send :

 require 'facets' [1, 2, 3].map_send(:+, 1) #=> [2, 3, 4] 

编写自己的实现非常简单:

 module Enumerable def map_send(*args) map { |obj| obj.send(*args) } end end 

如果您确实需要使用Ampex库,但是我不知道它是否仍然保留。