Howto passer un nom de classe comme une variable à une autre classe en ruby
Je suis en train d'apprendre à créer un multi classe programme en ruby. J'ai codé un Moteur de classe et d'autres classes comme la ville, la rue, etc. et je rencontre des problèmes en passant le nom de la classe comme une variable à d'autres classes. Le code ci-dessous génère l'erreur: "la Ville.rb:15:dans 'intro': undefined variable locale ou de la méthode de jeu " pour # (NameError)". Je comprends le problème dans un sens, mais je ne pense pas que la ville a besoin de savoir quelque chose au sujet de
objet de jeu, je pense qu'il n'a qu'à le recevoir et transmettre. Mais appearantly j'ai un malentendu à propos de comment passer des variables (en particulier le nom de la classe) entre les classes. Ce qui est faux dans mon design?
#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
Aussi, fixer votre dénomination. Devrait être
city.rb
et game.rb
(les noms de fichiers - snake_case, les noms de classe - PascalCase).Merci pour l'astuce. J'ai essayé de passer le nom de la classe en tant que moteur du jeu.rb#6 en tant que soi et sur jeu.rb n ° 9 comme variable de moteur. C'est probablement là où je me trompe. Pouvez-vous me donner un très bon exemple de comment passer le nom d'une classe à une autre classe, totalement en dehors de mon exemple?
En passant
self
est très bien, mais à l'intérieur de votre intro
méthode dans la Ville.rb je pense que vous devriez être à l'aide de engine.play
plutôt que game.play
. Vous sont également manquants où vous assigner quelque chose à @street
...Avez-vous besoin de passer une instance de la classe ou du nom de la classe ou de la classe de l'objet?
OriginalL'auteur barerd | 2012-03-20
Vous devez vous connecter pour publier un commentaire.
Vous pouvez passer dans une classe comme un paramètre comme d'habitude:
Cependant, votre erreur n'est pas liée à cela. En fait, vous essayez d'utiliser l'objet
game
dans le cadre d'une classe, mais il n'existe pas encore là.Pour passer une référence au Jeu de l'instance de la classe ville, vous pouvez faire quelque chose comme:
et modifier le constructeur de la Ville de
Puis, la Ville de#intro:
Il y aura probablement d'autres erreurs, depuis
@street
n'est pas défini dans la Ville, mais c'est une autre affaire.\@var_name sont des variables de classe/les membres/les champs. Voir comment @city_name est initialisée. Voici un tutoriel sur les classes en ruby.
J'ai lu le tutoriel avant. Permettez-moi de le mettre comme ça: comment puis-je faire référence à un objet de la classe B à l'intérieur d'un autre objet de la classe A, alors que ni A ou B hérite les uns des autres? Quand l'un d'eux hérite, je peux le faire. Je travaille toujours avec la première partie du code (maclasse), et suis en train d'écrire ce commentaire afin de ne pas être trop en retard de la réponse, désolé.
Chaque objet doit avoir une référence à un autre objet de modifier sa propriété. Il n'y a pas moyen de contourner cela. Vous pouvez utiliser des variables globales de l' $foo qui permettent à tous d'instance et des méthodes pour accéder à la variable. Mais c'est un peu dangereux.
Donc, concernant mon code,
@city = City.new()
dans le jeu.rb n'est pas absolument nécessaire de se référer entre les uns des autres de la classe, mais il ajoute juste une commodité. Je vous remercie beaucoup.OriginalL'auteur Candide