ruby哈希,其中键来自数组,值为默认值

时间:2014-08-17 17:04:53

标签: ruby

我想创建一个名为default_classroom的方法。这样它需要一组键和一个默认值,并返回一个散列,所有键都设置为默认值。 (比如,所有学生都去同一个教室。在这里,学生是关键,班级是默认值)

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 个答案:

答案 0 :(得分:3)

有很多方法可以做到这一点。这是三个。

<强>#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"}

对于Ruby版本&gt; = 2.0,您可以改为:

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 #=> {}

相反,使用块初始化哈希,如下所示:

h = Hash.new { |h,k| h[k]=default_class }
  #=> {}

然后:

h["Billy-Bob"] == "Real Analysis"

再次宣告:

"Roofing 101" == "Real Analysis"
  #=> false

但现在:

h #=> {"Billy-Bob"=>"Roofing 101"}