我可以将参数传递给传递给map方法的符号吗?
代码:
[["a", "airway", "sarsaparilas"], ["a", "sarsaparilas", "airway"]].map!(&:join)
结果:
["aairwaysarsaparilas", "asarsaparilasairway"]
结果我对:
感兴趣 ["a airway sarsaparilas", "a sarsaparilas airway"]
我知道如何单独使用这些方法,但这次我对符号解决方案感兴趣:)
答案 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