2015-02-11 41 views
2

可以将参数传递给传递给map方法的符号吗?用连接将多维数组映射为proc

代码:

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

结果:

["aairwaysarsaparilas", "asarsaparilasairway"]

结果我很感兴趣:

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

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

+0

见@ UriAgassi的回答[这里](http://stackoverflow.com/questions/23695653/can-you-sup合股参数到所述-mapmethod - 句法 - 在旁注/ 23711606#23711606)。 – 2015-02-12 02:04:37

回答

1

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

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

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

$, = nil 
+0

很好的答案,谢谢,你能解释为什么你不会推荐使用这种方法吗? – 098328f3e4f871e81bd35600fdcd56 2015-02-11 18:14:57

+0

这是因为使用'#符号#to_proc'与'&'是一个没有参数的简单方法的简写。坚持使用它与争论没有使它更短或更可读。对于这种特殊情况,你可以像我上面写的那样做,但是我没有看到写'$,=“”'比用参数写入连接块简单 – sawa 2015-02-11 18:16:27

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

当然,这似乎并没有更好的,然后使用一个进程

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

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

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

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

&:join语法只是一个创建块的快捷方式,它的参数调用了.join,但是这种语法在任何情况下都不合适。

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

我可以传递参数,以符号

有人创造了一个宝石:

require 'ampex' 

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

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

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

你必须写&X.代替:

+1

这是非常有趣的工具,thx :)仅供参考,此图书馆的[链接](https://github.com/rapportive-oss/ampex)。 – 098328f3e4f871e81bd35600fdcd56 2015-02-11 21:50:58