【问题标题】:ruby hash where keys are from an array and value as a default valueruby 哈希,其中键来自数组,值作为默认值
【发布时间】:2014-10-10 16:07:32
【问题描述】:

我想创建一个名为 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

但仍然无法正常工作。请您给我建议,我该如何完成?

【问题讨论】:

  • Rabby,我很欣赏这个新手,但以后考虑在选择答案之前等待更长时间。匆忙做出判断可能会阻碍其他可能更好的答案,并且对于那些在复选标记出现时仍在准备答案的人来说是一个遗憾。许多 SO 成员要等上几个小时甚至几天。
  • 加里·斯沃夫兰,感谢您的建议。但我太兴奋了。
  • 这里不应该有 Rails 标签,因为这是一个纯 Ruby 问题。有一个多余的标签可能会导致一些人浪费时间,而另一些人(他们过滤掉 Rails 问题)看不到问题。
  • Cary Swoveland,我编辑了标签部分。

标签: ruby


【解决方案1】:

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

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

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

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

然后:

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

再次评估为:

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

但现在:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2020-07-02
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多