使用键入字符串数组的空数组初始化哈希-Ruby

使用键入字符串数组的空数组初始化哈希-Ruby,ruby,hash,initialization,Ruby,Hash,Initialization,我有: people=["Bob","Fred","Sam"] holidays = Hash.new people.each do |person| a=Array.new holidays[person]=a end gifts = Hash.new people.each do |person| a=Array.new gifts[person]=a end 感觉笨重。我似乎想不出一个更精简的初始化块之类的东西。这里有惯用的方法吗 理想情况下,我希望保留如下数组:

我有:

people=["Bob","Fred","Sam"]

holidays = Hash.new 
people.each do |person|
  a=Array.new
  holidays[person]=a
end

gifts = Hash.new
people.each do |person|
  a=Array.new
  gifts[person]=a
end
感觉笨重。我似乎想不出一个更精简的初始化块之类的东西。这里有惯用的方法吗

理想情况下,我希望保留如下数组:

lists["holidays","gifts",...]  

。。。并通过它初始化列表数组中的每个元素。

如果您只需要一些这样的散列,那么以下内容就足够了:

count_of_hashes = 4 // lists.count; 4 is chosen randomly by throwing a fair die

people = ["Bob", "Fred", "Sam"]

lists = count_of_hashes.times.map do
  people.map {|person| [person, []]}.to_h
end
这段代码还确保数组和散列都占用它们自己的内存。可通过以下代码进行验证:

holidays, gifts, *rest = lists
holidays["Bob"] << "Rome"
后者生成“惰性初始化嵌套哈希”。它使用构造函数进行嵌套哈希


玩一下,看看它是如何工作的。

一种常见的方法是使用


礼物
是一样的。

我不太明白。为什么n=3?为什么要使用3.times.map?n是要初始化的哈希数。3.times.map需要更改为n.times.map。根本没有理由使用它。
people
数组可以直接重新映射。在原始问题中,
people
数组的长度决定了要创建多少个条目。在这里,由于无法解释的原因,3出现了。OP在他的问题中提到
列出了[“假日”、“礼物”、…]
。他正试图初始化多个这样的散列。n是数组
列表中此类散列的数目。n as 3就是一个例子@塔德曼:这能消除混乱吗?n=3不是people数组中的人数。哦,事实上,
people.map{{p{p}[p,[]}。对于{u h
?@mudasobwa,请叫我古怪,但将数组转换为哈希会让我感到不舒服,至少当其他方法可用时是这样。与将字符串转换为数组相同,操作数组,然后合并以生成字符串。如果我能直接操纵字符串,我会更高兴。(并不是说我会失眠……)老实说,我确实102%同意,但我内心的懒惰野兽总是以“少打字”的论点赢得这场战斗:)有趣。看起来这实际上是一个散列。这不是我所要求的,但实际上对我来说可能更可取。谢谢你哦。谢谢我会的。像
{gives:[],holidays:[]}
这样的结构对于每个人来说可能比以相反的方式进行结构更有意义,假期按人分配,礼物按人分配。这似乎是一个作业问题。
lists
=> [
    {"Bob"=>["Rome"], "Fred"=>[], "Sam"=>[]},
    {"Bob"=>[], "Fred"=>[], "Sam"=>[]},
    {"Bob"=>[], "Fred"=>[], "Sam"=>[]},
    {"Bob"=>[], "Fred"=>[], "Sam"=>[]}
   ]
people = %w|Bob Fred Sam|
data = %w|holidays gifts|

result = data.zip(data.map { people.zip(people.map { [] }).to_h }).to_h
result['holidays']['Bob'] << Date.today
#⇒ {
#    "holidays" => {
#         "Bob" => [
#           [0] #<Date: 2016-11-04 ((2457697j,0s,0n),+0s,2299161j)>
#         ],
#        "Fred" => [],
#         "Sam" => []
#    },
#       "gifts" => {
#         "Bob" => [],
#        "Fred" => [],
#         "Sam" => []
#    }
# }
result = data.map do |d| 
  [d, Hash.new { |h, k| h[k] = [] if people.include?(k) }]
end.to_h
holidays = people.each_with_object({}) { |p,h| h[p] = [] }
  #=> {"Bob"=>[], "Fred"=>[], "Sam"=>[]}