如何在 ruby 中使用哈希值获取默认值

问题描述 投票:0回答:2

我试图在 ruby 中使用哈希时获取默认值。 查找您使用 fetch 方法的文档。 因此,如果未输入哈希值,则它默认为一个值。 这是我的代码。

def input_students
  puts "Please enter the names and hobbies of the students plus country of    birth"
  puts "To finish, just hit return three times"

  #create the empty array
  students = []
  hobbies = []
  country = []
  cohort = []

  # Get the first name
  name = gets.chomp
  hobbies = gets.chomp
  country = gets.chomp
  cohort = gets.chomp

  while !name.empty? && !hobbies.empty? && !country.empty? && cohort.fetch(:cohort, january) do #This is to do with entering twice
    students << {name: name, hobbies: hobbies, country: country, cohort: cohort} #import part of the code.
    puts "Now we have #{students.count} students"

    # get another name from the user
    name = gets.chomp
    hobbies = gets.chomp
    country = gets.chomp
    cohort = gets.chomp
  end
  students
end
ruby
2个回答
29
投票

你只需要给

fetch
一个它可以处理的默认值。它不知道如何处理
january
,因为您还没有声明任何具有该名称的变量。如果你想将默认值设置为字符串
"january"
,那么你只需要像这样引用它:

cohort.fetch(:cohort, "january") 

fetch
的文档中有一些不错的示例。

此外,

cohort
不是
Hash
,它是
String
,因为
gets.chomp
返回
String
fetch
用于从
Hash
“获取”值。您使用它的方式应该会抛出类似于以下内容的错误:
undefined method 'fetch' for "whatever text you entered":String

最后,由于您在条件中使用它,因此将评估您调用

fetch
的结果的真实性。如果您设置默认值,它将始终被评估为
true

如果您只想为

cohort
设置默认值(如果它为空),您可以执行以下操作:

cohort = gets.chomp
cohort = "january" if cohort.empty?
while !name.empty? && !hobbies.empty? && !country.empty?
  students << {
    name: name,
    hobbies: hobbies,
    country: country,
    cohort: cohort
  }
  ... # do more stuff

希望对您有帮助。


24
投票

您有多种选择。 @dinjas 提到了一种,很可能是您想要使用的一种。假设你的哈希是

h = { :a=>1 }

然后

h[:a] #=> 1
h[:b] #=> nil

假设默认值为

4
。然后按照 dinjas 的建议,你可以写

h.fetch(:a, 4) #=> 1
h.fetch(:b, 4) #=> 4

但其他选择是

h.fetch(:a) rescue 4 #=> 1
h.fetch(:b) rescue 4 #=> 4

h[:a] || 4 #=> 1
h[:b] || 4 #=> 4

您还可以使用 Hash#default=:

将默认值构建到哈希本身中
h.default = 4
h[:a] #=> 1
h[:b] #=> 4

或者通过像这样定义哈希:

g = Hash.new(4).merge(h)
g[:a] #=> 1
g[:b] #=> 4

参见 Hash::new

© www.soinside.com 2019 - 2024. All rights reserved.