bar*_*erd 9 ruby variables parameter-passing
我正在努力学习在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, 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
Run Code Online (Sandbox Code Playgroud)
Can*_*ide 17
您可以像往常一样将类作为参数传递:
def use_class(myclass)
x = myclass.new "test"
x.read_name
end
use_class(City)
# returned -> ' You are in a city called "test".'
Run Code Online (Sandbox Code Playgroud)
但是,您的错误与此无关.基本上,您尝试game在类的范围内使用该对象,但它尚不存在.
要将对Game实例的引用传递给class city,您可以执行以下操作:
@city = City.new(city_name, self)
Run Code Online (Sandbox Code Playgroud)
并修改City的构造函数
def initialize(city_name, game)
@city_name = city_name
@game = game
end
Run Code Online (Sandbox Code Playgroud)
那么,City #intro将会:
@game.play(@street, :enter, @game)
Run Code Online (Sandbox Code Playgroud)
可能会有其他错误,因为@street尚未在City中定义,但这是另一回事.
| 归档时间: |
|
| 查看次数: |
12639 次 |
| 最近记录: |