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

not*_*nil 41 ruby

给出以下数组a:

a = [1, 2, 3, 4, 5]  
Run Code Online (Sandbox Code Playgroud)

我该怎么办:

a.map { |num| num + 1 }  
Run Code Online (Sandbox Code Playgroud)

使用简短表示法:

a.map(&:+ 1)  
Run Code Online (Sandbox Code Playgroud)

要么:

a.map(&:+ 2)  
Run Code Online (Sandbox Code Playgroud)

其中1和2是参数?

And*_*imm 41

在这种情况下,你可以做到

a.map(&1.method(:+))
Run Code Online (Sandbox Code Playgroud)

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

以下是在性能上下文中对此实践的讨论.


Ser*_*sev 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`.
Run Code Online (Sandbox Code Playgroud)

&是一个简写to_proc:

def to_proc
  proc { |obj, *args| obj.send(self, *args) }
end
Run Code Online (Sandbox Code Playgroud)

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

  • @SeanMackesey为了更准确,`&`不会将带有'to_proc`的符号或任何东西转换为proc.它将proc转换为块.应用`to_proc`是由于隐式类转换. (7认同)
  • @not_nil:Ruby不支持超出`Symbol#to_proc`的任何东西的无点样式,因为它缺少函数组合和currying.你来自功能背景吗? (2认同)

tok*_*and 25

你做不到map.但是看看FacetsEnumerable#map_send:

require 'facets'
[1, 2, 3].map_send(:+, 1)
#=> [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

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

module Enumerable
  def map_send(*args)
    map { |obj| obj.send(*args) }
  end
end
Run Code Online (Sandbox Code Playgroud)