需要在Ruby中使用用户输入创建哈希

时间:2016-11-03 17:50:33

标签: ruby

目标是让用户输入3个单独的数字并让脚本将其存储在哈希中,输出值,然后在哈希中添加所有数字。我正在处理的脚本不断出错,我希望能就如何纠正它提供一些指导。

#!/user/bin/ruby
userhash=Hash.new()
puts "Enter first number"
userhash=[:num1=>gets.chomp]
puts "Enter second number"
userhash=[:num2=>gets.chomp]
puts "Enter third number"
userhash=[:num3=>gets.chomp]
puts "The numbers entered were"
userhash.each_value {|value| puts value}
puts "the sum is #{userhash.inject(:+)}"

我刚刚完成了这个作为一个没有问题的数组,并认为将它作为一个哈希非常相似。显然它没有按预期工作。感谢帮助。

Error: rb:15:in '<main>': undefined method 'each_value' for [{:num3=>"3"}]:Array (NoMethodError)

我在提示测试时输入了值1,2,3。

UDPATE:Orde的方法帮助我开始工作

#!/user/bin/ruby
userhash=Hash.new()
puts "Enter first number"
userhash[:num1]=gets.chomp.to_f
puts "Enter 2nd number"
userhash[:num2]=gets.chomp.to_f
puts "Enter 3rd number"
userhash[:num3]=gets.chomp.to_f
puts "The number you entered were "
userhash.each_value {|value| puts value}
puts "The sum of those number is #{userhash.each_value.inject(:+)}"

2 个答案:

答案 0 :(得分:0)

您反复重新分配到userhash并指定一个数组(例如[:num1=>gets.chomp])。由于Array没有each_value方法,因此会抛出undefined method

userhash=Hash.new()
puts userhash.class                  #=> Hash
puts "Enter first number"
userhash=[:num1=>gets.chomp]
puts userhash.class                  #=> Array

要将值与键相关联,element assignment语法为hash_name[key] = value

userhash=Hash.new()
puts "Enter first number"
userhash[:num1] = gets.chomp
puts "The numbers entered were"
userhash.each_value {|value| puts value}
puts userhash.class                  #=> Hash 

答案 1 :(得分:0)

此代码中存在很多错误。这是一个重构版本:

# Declare an empty hash with the { } notation
entries = { }

# Request input N times
(1..3).each do |n|
  puts "Enter number %d" % n

  # Add this entry to the hash, convert it to an integer with to_i
  entries[:"num#{n}"] = gets.chomp.to_i
end

# Add the numbers together and have a default of 0 in case the array
# is empty.
puts "the sum is %d" % entries.values.inject(0, :+)

您的原始代码将userhash变量重新定义为带有散列的数组。这个新代码将事物组织成一个包含多个条目的哈希,但考虑到它的使用方式,这并不是必需的。相反,你可以这样做:

sum = 0

(1..3).each do |n|
  puts "Enter number %d" % n
  sum += gets.chomp.to_i
end

puts "the sum is %d" % sum