2016-11-10 3 views
-2

「オブジェクト指向プログラミング、パートI」までのcodecademyコースを終えて初めてRubyを使いこなしました。電卓を作ろうと決めた。しかし、何らかの理由でこのエラーが発生します。私は単純なRuby電卓を設計しようとしていますが、エラーが発生しています

calc.rb:13:in `addition': undefined local variable or method `user_input' for main:Object (NameError) 
    from calc.rb:21:in `<main>' 

"user_input"という配列が表示されないのはなぜですか?それは方法の範囲外ですか?それを間違って初期化しましたか?

あなた自身で見ることができるように、ここにコードがあります。明らかに洗練されたものではなく、完成していません。私はちょうど今追加のためにテストしようとしています。

#!/usr/bin/env ruby 

user_input = Array.new 

puts "Would you like to [a]dd, [s]ubtract, [m]ultiply, or [d]ivide? " 

type_of_math = gets.chomp 

def addition 
    operator = :+ 
    puts "Please enter the numbers you want to add (enter \"=\" to stop adding numbers): " 
    until gets.chomp == "=" 
    user_input << gets.chomp.to_i 
    end 
    sum = user_input.inject(operator) 
    return sum 
end 

case type_of_math 
when "a" 
    addition 
when "s" 
    puts "Test for subtraction" 
when "m" 
    puts "Test for multiplication" 
when "d" 
    puts "Test for division" 
else 
    puts "Wrong" 
end 
+1

「方法の範囲外ですか?」はい。 – meagar

+0

@Vanramは 'until gets.chomp ==" = "'と 'user_input << gets.chomp.to_i'はどちらも行を読みます。これはおそらくあなたが望むものではありません。 – Stefan

+0

@Stefanこれを修正することをどうお勧めしますか? – Vanram

答えて

0

この未テストのバリエーションをコードで検討してください。それはより多くの慣用だ:それは方法にuser_inputを置くこと

def addition 
    user_input = [] 
    puts 'Please enter the numbers you want to add (enter "=" to stop adding numbers): ' 
    loop do 
    input = gets.chomp 
    break if input == '=' 
    user_input << input 
    end 
    user_input.map(&:to_i).inject(:+) 
end 

注意してください。また、通常の[]を使用して、空の配列を直接割り当てて初期化します。 chomp.to_iのように、入力した値はループが終了するまでそれを待っています。

whileループの代わりにloop doを使用することを検討してください。それらは、コードをスキャンするときにより容易に見える傾向があります。

また、方法の最後にはreturnがありません。 Rubyは最後に表示された値を自動的に返します。

関連する問題