2016-11-10 4 views
-2

Also habe ich zum ersten Mal mit Ruby rumgespielt, nachdem ich den Codecademy-Kurs bis zu "Object Oriented Programming, Part I" und I abgeschlossen habe beschlossen, einen Taschenrechner zu machen. Aus irgendeinem Grund bekomme ich diesen Fehler:Ich versuche einen einfachen Ruby-Rechner zu entwerfen und erhalte einen Fehler

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

Ich bin verwirrt, warum es nicht meine „USER_INPUT“ Array sieht. Liegt es außerhalb des Anwendungsbereichs der Methode? Habe ich es falsch initialisiert?

Hier ist der Code, damit Sie selbst sehen können, es ist offensichtlich nichts anspruchsvoll und es ist nicht fertig. Ich versuche gerade jetzt, den Zusatz zu testen.

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

"Ist es nicht im Rahmen der Methode?" Ja. – meagar

+0

@Vanram Beachten Sie, dass 'bis gets.chomp ==" = "' und 'user_input << gets.chomp.to_i" beide eine Zeile lesen. Dies ist wahrscheinlich nicht das, was Sie wollen. – Stefan

+0

@Stefan Wie würden Sie vorschlagen, dies zu beheben? – Vanram

Antwort

0

Betrachten Sie diese ungeprüfte Variante Ihres Codes. Es ist mehr idiomatische:

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 

Beachten Sie, dass es user_input in die Methode versetzt. Es verwendet auch die normale [] direkte Zuweisung eines leeren Arrays, um es zu initialisieren. Anstatt chomp.to_i wird jeder Wert, wie er eingegeben wird, darauf warten, bis die Schleife beendet ist.

Verwenden Sie anstelle von while Schleifen loop do. Sie neigen dazu, beim Scannen von Code leichter zu sehen.

Beachten Sie auch, dass es keine return am Ende der Methode gibt. Ruby gibt automatisch den zuletzt gesehenen Wert zurück.

Verwandte Themen