2012-11-21 45 views
0

我想知道是否有寫以下行的更優雅的方式:如何使這個哈希創建漂亮

section_event_hash = [] 
sections.each do |s| 
    section_event_hash << { s => s.find_all_events } 
end 

我想創建一個哈希的鍵是的sections的元素,和值是由find_all_events方法返回的元素的數組。

+0

問題不明確。變量名'section_event_hash'表明它是一個散列,並且你的代碼爲它分配一個數組,並且你說你想創建一個散列。 – sawa

回答

1

您發佈的代碼並不完全符合您所說的要求。讓我們來仔細看看它通過測試,像這樣:

sections = ["ab", "12"] 

section_event_hash = [] 
sections.each do |s| 
    section_event_hash << { s => s.split("") } 
end 

puts section_event_hash.inspect 

給出:

[{"ab"=>["a", "b"]}, {"12"=>["1", "2"]}] 

所以,你實際上已經創建散列,其中每個哈希包含一個鍵值對的數組。

以下代碼會生成一個包含多個元素的散列。注意如何用{}而不是[]來創建一個空的散列。大括號是散列的符號,而方括號是指特定的鍵。

section_event_hash = {} 
sections.each do |s| 
    section_event_hash[s] = s.split("") 
end 

puts section_event_hash.inspect 

=>{"ab"=>["a", "b"], "12"=>["1", "2"]}

至於這樣做的一個 「更優雅」 的方式,也取決於你的定義。正如這裏的其他答案所示,通常有不止一種方法可以在Ruby中進行某些操作。 seph的產生與原始代碼相同的數據結構,而mu的產生你描述的散列。就我個人而言,我只是瞄準易於閱讀,理解和維護的代碼。

3

如果你想section_event_hash真的是一個Hash,而不是一個數組,那麼你可以使用each_with_object

section_event_hash = sections.each_with_object({}) { |s, h| h[s] = s.find_all_events } 

你可以使用map建立一個數組的數組,然後養活,爲Hash\[\]

section_event_hash = Hash[sections.map { |s| [s, s.find_all_events] }] 
0
array_of_section_event_hashes = sections.map do |s| 
    {s => s.find_all_events} 
end