Howto pass der name einer Klasse als variable einer anderen Klasse in ruby
Ich versuche zu lernen, zu schaffen, ein multi-class-Programm in ruby. Ich codiert eine Engine-Klasse und einigen anderen Klassen, wie Stadt, Straße, etc. und habe Probleme, mich im Vorbeigehen den Namen der Klasse als variable zu den anderen Klassen. Der folgende code wirft den Fehler: "die Stadt.rb:15:in 'intro': undefined local variable oder Methode im Spiel für die # (NameError)". Ich verstehe das problem so, aber ich glaube nicht, die Stadt muss wissen, etwas über
Spiel-Objekt, ich denke es nur, um es zu bekommen, und übergeben Sie es zurück. Aber anscheinend habe ich ein Missverständnis darüber, wie zur übergabe von Variablen (insbesondere der name der Klasse) zwischen den Klassen. Was ist falsch in meinem 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
- Ich sehe nicht, wo Sie auf der Durchreise sind Klasse Namen hier.
- Auch fixieren Sie Ihre Namensgebung. Sollte
city.rb
undgame.rb
(Dateinamen - snake_case, Klassen - PascalCase). - Danke für den Tipp. Ich habe versucht, übergeben Sie den Klassennamen als Motor auf dem Spiel.rb#6 wie sich selbst und auf das Spiel.rb#9 als variable Motor. Dies ist wahrscheinlich, wo ich mich Irre. Können Sie mir ein solides Beispiel dafür, wie pass der name einer Klasse in eine andere Klasse, ganz abgesehen von meinem Beispiel?
- Vorbei
self
ist in Ordnung, jedoch innerhalb Ihrerintro
- Methode in der Stadt.rb ich denke, Sie sollten mitengine.play
eher alsgame.play
. Sie fehlen auch, wo Sie ordnen etwas zu@street
... - Brauchen Sie, um eine Instanz von class oder class-Namen oder die Klasse object?
- Ich Plane, pass, class-Objekt. Und ich denke, ich weiß es pass mit Motor-variable und sich selbst.
- Spiel.spielen ist in Ordnung, da geht es den engine-Objekts Stadt. Wenn ich es ändern an der engine.spielen, es beschwert sich Undefinierte lokale variable oder Methode.
- Sie sind vorbei Instanz der Klasse, nicht der Klasse object. Diese beiden sind anders.
- Sorry für die späte Antwort, aber ich habe mal gegoogelt, für die mittlerweile, und konnte nicht finden, dass irgendetwas nützlich. Also wie gebe ich das class-Objekt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie eine Klasse als parameter-wie üblich:
Jedoch Ihren Fehler nicht damit in Zusammenhang stehen. Im Grunde, Sie versuchen, das Objekt zu verwenden
game
im Rahmen einer Klasse, aber gibt es da gar nicht noch.Übergeben eine Referenz auf die Game-Instanz der Klasse Stadt, können Sie etwas tun:
und ändern den Konstruktor von Stadt zu
Dann, City#intro hätte:
Gibt es wahrscheinlich andere Fehler sein, da
@street
ist nicht definiert in der Stadt noch nicht, aber das ist eine andere Sache.@city = City.new()
im Spiel.rb ist nicht absolut notwendig zu finden zwischen jeder anderen Klasse, aber es fügt nur eine Bequemlichkeit. Ich danke Ihnen sehr.