2012-03-20 32 views
8

Estoy tratando de aprender a crear un programa de clases múltiples en ruby. Codifiqué una clase Engine y algunas otras clases como city, street, etc. y tengo problemas para pasar el nombre de la clase como variable a otras clases. El código siguiente arroja el error: "City.rb: 15: in 'intro': variable local indefinida o juego de método 'for # (NameError)". Entiendo el problema de alguna manera, pero no creo que esa ciudad necesite saber nada sobre el objeto de juego , creo que solo tiene que obtenerlo y devolverlo. Pero aparentemente tengo un malentendido acerca de cómo pasar variables (especialmente el nombre de clase) entre clases. ¿Qué está mal en mi diseño?Cómo pasar un nombre de clase como una variable a otra clase en ruby ​​

#Game.rb 
require './City.rb' 
class Engine 
    def initialize(city_name, street_name, budget) 
    @city = City.new(city_name) 
    @city.read_name() 
    play(@city, :intro, self) 
    end 

    def play(place, next_step, engine) 
    while true 
     next_step = place.method(next_step).call(place, next_step, engine) 
    end 
    end 
end 

game = Engine.new("Casablanca", "Costanza Boulvard", 200) 

#City.rb 
class City 
    def initialize(city_name) 
    @city_name = city_name 
    end 

    def read_name() 
    puts <<-READ_NAME 
    You are in a city called "#{@city_name}". 
    READ_NAME 
    end 

    def intro(place, next_step, engine) 
    puts "...." 
    game.play(@street, :enter, engine) 
    end 
end 
+0

No veo dónde está pasando el nombre de la clase aquí. –

+0

Además, arregle su nombre. Debería ser 'city.rb' y' game.rb' (nombres de archivo - snake_case, nombres de clase - PascalCase). –

+0

Gracias por la sugerencia. Traté de pasar el nombre de clase como engine en game.rb # 6 como self y en game.rb # 9 como motor variable. Esto es probablemente donde estoy equivocado. ¿Me puede dar un ejemplo sólido de cómo pasar un nombre de clase a otra clase, totalmente aparte de mi ejemplo? – barerd

Respuesta

15

Puede pasar en una clase como un parámetro como de costumbre:

def use_class(myclass) 
    x = myclass.new "test" 
    x.read_name 
end 

use_class(City) 
# returned -> ' You are in a city called "test".' 

Sin embargo, el error no está relacionado con esto. Básicamente, estás tratando de usar el objeto game dentro del alcance de una clase, pero todavía no existe.

Para pasar una referencia a la instancia del juego a la ciudad de la clase, se puede hacer algo como:

@city = City.new(city_name, self) 

y modificar el constructor de la ciudad a

def initialize(city_name, game) 
    @city_name = city_name 
    @game = game 
    end 

Entonces, Ciudad # de introducción haría tener:

@game.play(@street, :enter, @game) 

probablemente habrá otros errores, ya que no es @street defin ed en la ciudad todavía, pero eso es otro asunto.

+0

Cuando veo el problema de esta manera, suena muy lógico y fácil. Como mencioné, tengo una curva de aprendizaje muy pronunciada para pasar parámetros, ya sea para métodos o clases. He leído y sigo leyendo tutoriales sobre esto, pero siempre cometo errores. ¿Podría indicarme un buen documento sobre cómo pasar los parámetros o la orientación del objeto para poder encontrarlo por mí mismo, cómo debería definirse @street en City? – barerd

+0

\ @var_name son variables de clase/miembros/campos. Vea cómo se inicializa @city_name. Aquí hay un [tutorial] (http://juixe.com/techknow/index.php/2007/01/22/ruby-class-tutorial/) sobre clases en ruby. – Candide

+0

He leído ese tutorial antes. Permítanme ponerlo así: ¿cómo puedo hacer referencia a un objeto de clase B dentro de otro objeto de clase A, mientras que ni A ni B heredan el uno del otro? Cuando uno de ellos hereda, puedo hacerlo.Todavía estoy trabajando con la primera parte de tu código (myclass) y estoy escribiendo este comentario para que no sea una respuesta demasiado tarde, lo siento. – barerd

Cuestiones relacionadas