如何将参数传递给array.map快捷方式?

时间:2012-03-29 20:05:57

标签: ruby

给定以下数组a

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

我该怎么做:

a.map { |num| num + 1 }  

使用简短表示法:

a.map(&:+ 1)  

或:

a.map(&:+ 2)  

其中1和2是参数?

4 个答案:

答案 0 :(得分:40)

在这种情况下,您可以

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

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

Here is a discussion of this practice in a performance context.

答案 1 :(得分:34)

你不能这样做。 &运算符用于将符号转换为过程。

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

它创建并返回新的proc。如您所见,您无法将任何参数传递给此方法。您只能调用生成的过程。

答案 2 :(得分:25)

您无法使用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

答案 3 :(得分:0)

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