ruby 散列,其中键来自数组,值作为默认值

标签 ruby

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

相关文章:

Ruby - 从字符串中删除模式

ruby - 在 ruby​​ 中获取 OAuth token (用于 Mendeley API)

ruby - 有没有办法自动更新 RSpec 期望值?

ruby-on-rails - 在 Gitlab CI 上将 Redis 用于 Rails 项目

ruby-on-rails - 使用 form_for 和 form_tag 同时传递参数

ruby-on-rails - ruby 中的 2 级深度分组

ruby - 如何从 ruby​​ 线程获取错误消息

ruby-on-rails - 使用 neo4j-database 进行 Rails rspec 测试会给出 ActiveRecord::AdapterNotSpecified-error

ruby - 我们如何在 Ruby 中进行图形表示

ruby-on-rails - Shoulda on Rails - 应该推迟 render_with_layout