使用 join as proc 映射多维数组

Map multidimensional array with join as proc

我可以将参数传递给传递给 map 方法的符号吗?

代码:

[["a", "airway", "sarsaparilas"], ["a", "sarsaparilas", "airway"]].map!(&:join)

结果:

["aairwaysarsaparilas", "asarsaparilasairway"]

我感兴趣的结果:

["a airway sarsaparilas", "a sarsaparilas airway"]

我知道如何分别使用这些方法,但这次我对符号解决方案感兴趣:)

唯一的方法是创建一个方法来做到这一点。

def my_join(a)
  a.join(" ")
end

arr = [["a", "airway", "sarsaparilas"], ["a", "sarsaparilas", "airway"]]

arr.map &method(:my_join) # => ["a airway sarsaparilas", "a sarsaparilas airway"] 

当然,这似乎并没有比使用 proc

好多少
my_join = proc {|a| a.join(" ") }

arr.map &my_join # => ["a airway sarsaparilas", "a sarsaparilas airway"] 

你可以简单地传入一个块,而不是写 &:join:

a = [["a", "b", "c"], ["d", "e", "f"]]
a.map { |x| x.join(' ') }  # => ["a b c", "d e f"]

&:join 语法只是创建在其参数上调用 .join 的块的快捷方式,但该语法并非适用于所有情况。

您可以定义 Array::to_proc 以使用数组而不是符号:

class Array
  def to_proc
    ->(element) { element.send(*self) }
  end
end

现在你可以这样使用了:

a=[["a", "airway", "sarsaparilas"], ["a", "sarsaparilas", "airway"]]
a.map &[:join] # => ["aairwaysarsaparilas", "asarsaparilasairway"] 
a.map &[:join, ' '] # => ["a airway sarsaparilas", "a sarsaparilas airway"]

我不建议这样做,但如果你坚持,这是一种方法:

$, = " "
[["a", "airway", "sarsaparilas"], ["a", "sarsaparilas", "airway"]].map!(&:join)
#=> ["a airway sarsaparilas", "a sarsaparilas airway"]

如有必要,您可以在执行此操作后将 $, 恢复为默认值。

$, = nil

can I pass argument, to symbol

有人为此创建了 gem:

require 'ampex'

arr = [["a", "airway", "sarsaparilas"], ["a", "sarsaparilas", "airway"]]

p arr.map!(&X.join(' '))

--output:--
["a airway sarsaparilas", "a sarsaparilas airway"]

你必须写 &X. 而不是 :