使用join作为proc映射多维数组

时间:2015-02-11 16:41:17

标签: ruby proc

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

代码:

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

结果:

["aairwaysarsaparilas", "asarsaparilasairway"]

结果我对:

感兴趣

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

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

5 个答案:

答案 0 :(得分:3)

您可以定义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"]

答案 1 :(得分:2)

  

我可以将参数传递给符号

有人为此创造了一个宝石:

require 'ampex'

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

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

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

您必须写&X.而不是:

答案 2 :(得分:1)

唯一的方法是创建一个可以实现这一目标的方法。

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"] 

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

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

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

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

$, = nil