我想知道是否有更优雅的方式来编写以下几行:
section_event_hash = []
sections.each do |s|
section_event_hash << { s => s.find_all_events }
end
我想创建一个哈希,其键是sections
的元素,值是find_all_events
方法返回的元素数组。
答案 0 :(得分:3)
如果您希望section_event_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] }]
答案 1 :(得分: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
=&GT; {"ab"=>["a", "b"], "12"=>["1", "2"]}
更优雅&#34;这样做的方式,取决于你的定义。正如其他答案所示,在ruby中通常有不止一种方法可以做。 seph的产生与原始代码相同的数据结构,而mu产生你描述的哈希。就个人而言,我只针对易于阅读,理解和维护的代码。
答案 2 :(得分:0)
array_of_section_event_hashes = sections.map do |s|
{s => s.find_all_events}
end