我为这个潜在的愚蠢问题道歉,我是Ruby和代码的绝对初学者。
我已经设置了一个具有一些预定值的哈希值。我想询问用户输入,如果该输入与现有密钥匹配,我希望更新相应的值(在这种情况下为+ 1)。然后我想打印所有当前的最新值。
hash = {"apple": 6, "banana": 2, "carrot": 3}
order = gets.chomp.downcase
hash.each do |key, value|
if key.to_s == order
value += 1
puts "Your order includes: #{value} #{key}."
end
end
我的问题是我只知道如何打印单个键值对。
例如。如果用户输入“apple”,我想输出说“你的订单包括:7个苹果,2个香蕉,3个胡萝卜”。
hash = {apple: 6, banana: 2, carrot: 3}
order = gets.chomp.downcase.to_sym
hash[order] = hash.fetch(order, 0) + 1
puts "Your order includes: " + hash.map { |k, v| "#{v} #{k}" }.join(", ")
一些说明:
hash = {"apple": 6, "banana": 2, "carrot": 3}
。哈希的键看起来像字符串,但如果你使用冒号的语法,它们就会成为符号。所以,你有两个选择。这个语法:
hash = {"apple" => 6, "banana" => 2, "carrot" => 3}
或者你可以像我一样使用符号并转换符号中的用户输入fetch
得到0。然后,我增加并分配回那个键问题没有说明你是否要改变初始哈希,所以我想你这样做。然后以下将做。
hash = Hash.new(0).merge(apple: 6, banana: 2, carrot: 3)
hash[gets.chomp.downcase.to_sym] += 1
puts "Your order includes: " <<
hash.map { |k, v| [v, k].join(' ') }.join(', ')
要么:
puts hash.reduce("Your order includes: ") { |acc, (k, v)|
acc << "#{v} #{k}, "
}[0..-3]
考虑初始化提供默认值的哈希值(Hash#default)
basket = {'apple' => 6, 'banana' => 2, 'carrot' => 3}
basket.default = 0 # <-- set default 0 for start counting new keys
定义一个呈现数据的方法:
def show(basket)
puts "Your order includes:"
basket.each{ |key, value| puts "#{value}: #{key}" }
end
在循环中捕获用户输入(注释中的说明):
loop do
puts "Place your order:"
order = gets.downcase.chomp # <-- format the input
break if order == '0' # <-- breaks the input loop if this contition is matched
next unless basket.has_key? order # <-- skip to next loop no matches with hash keys or remove this line if you want to count also non initialised keys
basket[order] += 1 # <-- increment by one the key
show(basket) # <-- call the metod to show the basket
end
show(basket)