我试图在 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
你只需要给
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
希望对您有帮助。
您有多种选择。 @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。