给定以下数组a
:
a = [1, 2, 3, 4, 5]
我该怎么做:
a.map { |num| num + 1 }
使用简短表示法:
a.map(&:+ 1)
或:
a.map(&:+ 2)
其中1和2是参数?
答案 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库,但我不知道它是否仍然保留。