如何将类名作为变量传递给ruby中的另一个类
Posted
技术标签:
【中文标题】如何将类名作为变量传递给ruby中的另一个类【英文标题】:Howto pass a class name as a variable to another class in ruby 【发布时间】:2012-04-04 17:47:56 【问题描述】:我正在尝试学习用 ruby 创建一个多类程序。我编写了一个引擎类和一些其他类,如城市、街道等,并且在将类名作为变量传递给其他类时遇到问题。下面的代码抛出错误:“City.rb:15:in 'intro': undefined local variable or method game' 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
【问题讨论】:
我没有看到你在这里传递类名。 另外,修正你的命名。应该是city.rb
和 game.rb
(文件名 - snake_case,类名 - PascalCase)。
感谢您的提示。我试图在 game.rb#6 上将类名作为引擎传递为 self,在 game.rb#9 上作为变量引擎传递。这可能是我弄错的地方。你能给我一个可靠的例子,说明如何将一个类名传递给另一个类,完全不同于我的例子吗?
传递self
很好,但是在City.rb 中的intro
方法中,我认为您应该使用engine.play
而不是game.play
。您也错过了将某些内容分配给@street
...
是否需要传递类或类名或类对象的实例?
【参考方案1】:
你可以像往常一样将一个类作为参数传入:
def use_class(myclass)
x = myclass.new "test"
x.read_name
end
use_class(City)
# returned -> ' You are in a city called "test".'
但是,您的错误与此无关。基本上,您试图在类的范围内使用对象game
,但它还不存在。
要将 Game 实例的引用传递给类 city,您可以执行以下操作:
@city = City.new(city_name, self)
并将 City 的构造函数修改为
def initialize(city_name, game)
@city_name = city_name
@game = game
end
那么,City#intro 会:
@game.play(@street, :enter, @game)
可能还有其他错误,因为 @street
尚未在 City 中定义,但这是另一回事。
【讨论】:
当我以这种方式研究问题时,听起来非常合乎逻辑和容易。正如我所提到的,我在传递参数方面有一个非常陡峭的学习曲线,无论是方法还是类。我已经阅读并继续阅读有关此的教程,但每次都会出错。你能不能给我指出一个关于传递参数或面向对象的好文档,以便我自己找到,@street 应该如何在 City 中定义。 \@var_name 是类变量/成员/字段。查看@city_name 是如何初始化的。这是关于 ruby 课程的tutorial。 我以前读过那个教程。让我这样说:我如何在 A 类的另一个对象中引用 B 类的对象,而 A 或 B 都不能相互继承?当其中一个继承时,我可以做到。我仍在处理您的代码的第一部分(myclass),并且正在写此评论,以免回复太晚,抱歉。 每个对象都必须有另一个对象的引用才能修改其属性。没有办法解决它。您可以使用 $foo 的全局变量来允许所有实例和方法访问该变量。但这有点危险。 所以,关于我的代码,game.rb 中的@city = City.new()
并不是绝对需要在其他类之间引用,但它只是增加了便利性。非常感谢。以上是关于如何将类名作为变量传递给ruby中的另一个类的主要内容,如果未能解决你的问题,请参考以下文章