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:オードの方法は、私は、これはあなたが繰り返しuserhashに再割り当てすると(例えば[:num1=>gets.chomp])の配列を割り当てている

#!/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

を動作させるために役立ってしまいました。 Arrayeach_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

関連する問題