2011-03-10 12 views
5

Estoy intentando crear un menú en Ruby para que, dependiendo de lo que ingresa un usuario, dependa de a qué clase se llame. Luego, afterwords volverá al "Principal" o la clase "Opciones" en este caso.Menú de opciones en Ruby

Espero que alguien me pueda ayudar. Aquí está mi código.

module Physics 
G = 21 
C = 20000 
Pi = 3.14 
D = 100 
end 

class Options 
puts "Please select 1 for Acceleration and 2 for Energy." 
option = gets() 
if option == 1 
then 
puts "AccelCalc" # This is the bit that needs to direct the user to the class AccelCalc 
else 
puts "EnergyCalc" # This needs to take them to EnergyCalc. 
end 
end 

class AccelCalc 
include Physics 
puts "Please enter the mass of the object" 
M = gets() 
puts "The mass of the object is " + M + "." 
puts "Please enter the speed of the defined object." 
S = gets() 
puts "The speed of the object is set at " + S + "." 
puts "The acceleration will now be calculated." 
puts S.to_i*M.to_i 
end 

class EnergyCalc 
include Physics 
puts "This will use the function E=MC^2 to calculate the Energy." 
puts "Enter object mass" 
M = gets() 
puts "The mass is " + M + "." 
puts "Now calculating the Energy of the object." 
puts M.to_i*C_to.i**2 
end 
$end 

También me gustaría poder después de que se haya llamado a la clase para volver a las opciones de clas. Estoy seguro de que esto es fácil, pero no puedo resolverlo.

Gracias de nuevo,

Ross.

+0

Entonces, ¿cuál es la pregunta? Solo puedo ver las declaraciones en ese texto. – DarkDust

Respuesta

0

Mientras yo realmente no obtener lo que se quiere aquí, una cosa que de inmediato saltó a mis ojos es este bloque:

option = gets() 
if option == 1 
then 
puts "AccelCalc" # This is the bit that needs to direct the user to the class AccelCalc 
else 
puts "EnergyCalc" # This needs to take them to EnergyCalc. 
end 

gets devuelve una cadena. Por lo que debe hacer:

case gets().strip() 
when "1" 
    puts "AccelCalc" 
when "2" 
    puts "EnergyCalc" 
else 
    puts "Invalid input." 
end 

He usado soportes explícitas aquí, en lugar de gets().strip() simplemente hay que escribir gets.strip en Ruby. Lo que hace esta expresión es leer algo de la entrada estándar y eliminar todos los espacios en blanco a su alrededor (nueva línea al presionar la tecla Intro). Luego se compara la cadena resultante.

+0

Bien ahora recibo "Entrada inválida". Después de seleccionar un ítem, ya sea 1 o 2, puedo ingresar otro ítem que siempre lo muestra. Después de ingresar cualquier número, el proceso ejecuta la clase AccelCalc y luego, dos veces, no regresa a la clase Opciones, sino que ejecuta EnergyCalc y luego termina después. – RossDoughty

+0

Lo siento, pero realmente no entiendo lo que estás haciendo o tratando de hacer ... lo que realmente me confunde es por qué pones la mayor parte del código en * cuerpos de clase * en lugar de métodos ... de esa manera el código es solo se ejecuta cuando la clase está definida. – DarkDust

1

estaba a punto de darle sólo algunos consejos - pero su código hace bastantes cosas mal:

  1. sangría - hacer que su código legible!
  2. El código en los cuerpos de clase es válido en ruby, pero eso no lo hace una buena idea, su uso principal es para metaprogramación.
  3. No capture la entrada del usuario en constantes. Ellos no están.

Entonces, ¿cómo lo codificaría? Algo como esto:

class App 

    def initialize 
    main_menu 
    end 

    def navigate_to(what) 
    what.new.display 
    main_menu 
    end 

    def main_menu 
    puts "Please select 1 for Acceleration and 2 for Energy." 
    case gets.strip 
    when "1" 
     navigate_to AccelCalc 
    when "2" 
     navigate_to EnergyCalc 
    else 
     puts "Choose either 1 or 2." 
     main_menu 
    end 
    end 
end 

class AccelCalc 
    include Physics 
    def display 
    puts "Please enter the mass of the object" 
    @m = gets.to_f 
    puts "The mass of the object is #{@m}." 
    puts "Please enter the speed of the defined object." 
    @s = gets.to_f 
    puts "The speed of the object is set at #{@s}." 
    puts "The acceleration will now be calculated." 
    puts @s * @m 
    end 
end 

# ... 

App.new # Run teh codez 
10

Puede consultar Highline. Es un marco agradable y simple para crear aplicaciones de consola. Instalarlo con

sudo gem install --no-rdoc --no-ri Highline

He aquí un ejemplo.

require "rubygems" 
require "highline/import" 

@C = 299792458 

def accel_calc 
    mass = ask("Mass? ", Float) 
    speed = ask("Speed? ", Float) 
    puts 
    puts("mass * speed = #{mass*speed}") 
    puts 
end 

def energy_calc 
    mass = ask("Mass? ", Float) 
    puts 
    puts("E=MC^2 gives #{mass*@C**2}") 
    puts 
end 

begin 
    puts 
    loop do 
    choose do |menu| 
     menu.prompt = "Please select calculation " 
     menu.choice(:Acceleration) { accel_calc() } 
     menu.choice(:Energy) { energy_calc() } 
     menu.choice(:Quit, "Exit program.") { exit } 
    end 
    end 
end 
+0

Definitivamente la mejor manera de resolver esto. –

Cuestiones relacionadas