如何将一个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库,但是我不知道它是否仍然保留。