2015-02-11 43 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