ruby - 如何将类名作为变量传递给ruby中的另一个类

标签 ruby variables parameter-passing

我正在尝试学习用 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

最佳答案

你可以像往常一样传入一个类作为参数:

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 中定义,但那是另一回事。

关于ruby - 如何将类名作为变量传递给ruby中的另一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9783778/

相关文章:

ruby-on-rails - 在不去除换行符的情况下在 Ruby 中分解多行的长字符串

c++ - 是否可以在标准 C++ 中打印变量的类型?

javascript - 将 PHP 数组转换为 JS 变量

powershell - 在命令行上设置公共(public)属性值

java - 如何将系统属性值传递给 processBuilder?

c++ - 用计数器扩展参数包

ruby - 救援 rake 任务

arrays - 范围开头的 * 是什么意思?

ruby-on-rails - Rails 3.1.3 在使用 compass+sussy+haml+scss 编译 Assets 时在登台服务器中出错

matlab - 有没有办法提示多个文件选择并将这些文件(和路径)分配给变量?