如何将类名作为变量传递给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.rbgame.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中的另一个类的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 makeStyles 将 prop 作为类名传递

如何将一个道具作为变量传递给 React 中的另一个道具?

从模板中的另一个类名派生一个类名

如何将 java 类名作为参数传递并将其用作方法中的强制转换

如果类名作为字符串传递,如何动态调用类的方法

我可以将顺风类名作为 React 中的道具传递吗?