2016-11-03 2 views
0

Цель состоит в том, чтобы заставить пользователя вводить 3 отдельных номера и иметь скрипт, хранящий их в хеш, выводить значения, а затем добавлять все числа в хеш. Сценарий, над которым я работаю, продолжает выходить из строя, и я надеялся на некоторое руководство по его исправлению.Необходимо создать хэш с использованием пользовательского ввода в Ruby

#!/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: метод Орд получил помог мне получить эту работу

#!/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(:+)}" 
+0

какая ошибка? –

+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 
+0

Используется этот метод и заставил его работать. –

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 
+0

Я ценю вашу помощь тадману. Я был явно потерян. –

+0

То, как вы теряетесь, - это попытка, которую вы сделали, поэтому в этом нет вреда. – tadman

Смежные вопросы