2009-07-27 15 views
5

Le pido al usuario que ingrese un nombre para una nueva clase que quiero crear. Mi código es:Cómo obtener una entrada de usuario En Ruby

puts "enter the name for a new class that you want to create" 
nameofclass = gets.chomp 
nameofclass = Class.new 

¿Por qué esto no funciona?

Además, quiero pedirle al usuario que ingrese el nombre de un método que deseo agregar a esa clase. Mi código es:

puts "enter the name for a new method that you want to add to that class" 
nameofmethod = gets.chomp 

nameofclass.class_eval do 
    def nameofmethod 
    p "whatever" 
    end 
end 

Esto tampoco funciona.

Respuesta

11

El siguiente código:

nameofclass = gets.chomp 
nameofclass = Class.new 

es interpretado por la máquina como:

Call the function "gets.chomp" 
Assign the output of this call to a new variable, named "nameofclass" 
Call the function "Class.new" 
Assign the output of this call to the variable "nameofclass" 

Como se puede ver, si usted sigue de lo anterior, hay una variable, que se asigna a dos veces . Cuando ocurre la segunda asignación, la primera se pierde.

Lo que estás tratando de hacer, es presumiblemente crear una nueva clase y ponerle el mismo nombre que el resultado de gets.chomp. Para ello, puede utilizar eval:

nameofclass = gets.chomp 
code = "#{nameofclass} = Class.new" 
eval code 

Hay otras maneras también, siendo este Ruby, pero eval es probablemente el más fácil de entender.

+0

gracias, me has ayudado mucho fuera –

+2

1 para la explicación clara/-1 para recomendar 'eval'. – rampion

+2

Debo señalar que acepto que 'eval' es desagradable de ver en el código de producción. Sin embargo, este parece ser un caso muy experimental en primer lugar; Nunca querrías hacer algo como esto. El beneficio de 'eval' es que es fácil de entender para un principiante, y funciona bien como una introducción a la meta-programación. – troelskn

5

Me gusta troelskn's answer por su explicación de lo que está sucediendo bastante.

Para evitar el uso del muy peligroso eval, intente esto:

Object.const_set nameofclass, Class.new 
Cuestiones relacionadas