我想创建一个名为 default_classroom 的方法。所以它需要一个键数组和一个默认值,并返回一个所有键都设置为默认值的散列。 (比如,所有学生都去同一个教室。这里,学生是键,类(class)是默认值)
def default_classroom(students, default_class)
end
puts default_classroom([:jony, :marry], 8)
# should return => {jony: 8, marry: 8}
我这样做了:
def default_classroom(students, default_class)
Hash[ students, default_class]
end
还有这个:
def default_classroom(students, default_class)
Hash[*students.flatten(default_class)]
end
但还是不行。请你给我建议,我该如何完成?
最佳答案
有很多方法可以做到这一点。这是三个。
#1
def default_classroom(students, default_class)
Hash[ students.product([default_class]) ]
end
students = %w[Billy-Bob, Trixie, Huck]
#=> ["Billy-Bob", "Trixie", "Huck"]
default_class = "Roofing 101"
default_classroom(students, default_class)
#=> {"Billy-Bob"=>"Roofing 101", "Trixie"=>"Roofing 101",
# "Huck"=>"Roofing 101"}
对于 >= 2.0 的 Ruby 版本,你可以这样写:
students.product([default_class]).to_h
#2
def default_classroom(students, default_class)
students.each_with_object({}) { |s,h| h[s] = default_class }
end
#3
根据您的应用,您可能只需要指定散列的默认值(而不是为每个学生添加键值对)。查看 Hash#new 的文档后,您可能认为这将按如下方式完成:
h = Hash.new(default_class)
#=> {}
然后:
h["Billy-Bob"] == "Real Analysis"
评估为:
"Roofing 101" == "Real Analysis"
#=> false
但哈希仍然是空的:
h #=> {}
相反,使用 block 初始化散列,如下所示:
h = Hash.new { |h,k| h[k]=default_class }
#=> {}
然后:
h["Billy-Bob"] == "Real Analysis"
再次评估为:
"Roofing 101" == "Real Analysis"
#=> false
但是现在:
h #=> {"Billy-Bob"=>"Roofing 101"}
关于ruby 散列,其中键来自数组,值作为默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25351538/