加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:24:50 所属栏目:百科 来源:网络整理
导读:我正在努力学习在 ruby中创建一个多类程序.我编写了一个Engine类和一些其他类,如city,street等,并且在将类名作为变量传递给其他类时遇到了问题.下面的代码抛出错误:“City.rb:15:in’intro’:未定义的局部变量或方法游戏’for#(NameError)”.我在某种程
我正在努力学习在 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,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,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实例的引用传递给class 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,@game)

可能会有其他错误,因为@street尚未在City中定义,但这是另一回事.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读