2012-03-20 144 views
8

我试图学会在ruby中创建多类程序。我编写了一个Engine类和一些其他类,比如城市,街道等,并且在将类名称作为变量传递给其他类时遇到了问题。下面的代码会抛出错误:“City.rb:15:in'intro':未定义的局部变量或方法游戏'for#(NameError)”。我从某种意义上理解了这个问题,但我认为这个城市不需要知道关于游戏对象的任何信息,我认为它只需要得到它并将其传回。但出乎意料地,我对如何在类之间传递变量(特别是类名)有误解。我的设计出了什么问题?如何将类名作为变量传递给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

我没有看到你在这里传递类名的地方。 – 2012-03-20 08:58:56

+0

另外,修复你的命名。应该是'city.rb'和'game.rb'(文件名--snake_case,类名--PascalCase)。 – 2012-03-20 08:59:59

+0

感谢您的提示。我试图将game.rb#6上的类名作为引擎传递给self,并将它作为可变引擎传递给game.rb#9。这可能是我误解的地方。你能给我一个关于如何将类名传递给另一个类的可靠例子,完全不同于我的例子吗? – barerd 2012-03-20 09:09:25

回答

15

您可以在一个类作为参数传递和往常一样:

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

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

但是,你的错误是不是与此有关。基本上,你试图在类的范围内使用对象game,但它还不存在。

传递给游戏实例的参考级的城市,你可以这样做:

@city = City.new(city_name, self) 

和修改城市的构造函数

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

随后,市#介绍会有:

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

可能会有其他错误,因为@street不是定义在城市编辑,但这是另一回事。

+0

当我用这种方式研究这个问题时,这听起来非常合乎逻辑和简单。正如我所提到的,我有一个非常陡峭的参数传递学习曲线,无论是方法还是课程。我已阅读并继续阅读关于此的教程,但每次都会犯错。你能介意给我一个关于传递参数或面向对象的好文档,以便我可以自己找到@street应该如何在City中定义。 – barerd 2012-03-20 13:29:51

+0

\ @var_name是类变量/成员/字段。看看@city_name是如何初始化的。这里是关于ruby中的类的[tutorial](http://juixe.com/techknow/index.php/2007/01/22/ruby-class-tutorial/)。 – Candide 2012-03-20 13:34:46

+0

我之前阅读过该教程。让我这样说:我怎样才能在类A的另一个对象内引用一个类B的对象,而A或B都不相互继承?当他们中的一个继承时,我可以做到。我仍然在使用代码的第一部分(myclass),并且正在撰写此评论,以便它不会太迟,对不起。 – barerd 2012-03-20 14:34:26