我正在努力学习在
ruby中创建一个多类程序.我编写了一个Engine类和一些其他类,如city,street等,并且在将类名作为变量传递给其他类时遇到了问题.下面的代码抛出错误:“City.rb:15:in’intro’:未定义的局部变量或方法游戏’for#(NameError)”.我在某种程度上理解这个问题,但我不认为这个城市需要知道任何事情
游戏对象,我认为它只需要得到它并传回去.但显然我对如何在类之间传递变量(尤其是类名)有误解.我的设计出了什么问题?
游戏对象,我认为它只需要得到它并传回去.但显然我对如何在类之间传递变量(尤其是类名)有误解.我的设计出了什么问题?
#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,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,engine) puts "...." game.play(@street,:enter,engine) end end
解决方法
您可以像往常一样将类作为参数传递:
def use_class(myclass) x = myclass.new "test" x.read_name end use_class(City) # returned -> ' You are in a city called "test".'
但是,您的错误与此无关.基本上,你试图在一个类的范围内使用对象游戏,但它还没有存在.
要将对Game实例的引用传递给class city,您可以执行以下操作:
@city = City.new(city_name,self)
def initialize(city_name,game) @city_name = city_name @game = game end
那么,City #intro将会:
@game.play(@street,@game)
可能会有其他错误,因为@street尚未在City中定义,但这是另一回事.