2

我了解类是如何工作的以及如何制作它们,但是练习的第二个额外学分说要在 2 个不同的文件中创建一个两个类的版本。

我尝试了不同的东西,但我不知道如何使它工作......

我不知道我是否没有在正确的地方搜索,但我找不到任何帮助,也找不到任何解决方案......

如果有人可以帮助我,将不胜感激:)

这是练习:http ://ruby.learncodethehardway.org/book/ex42.html

到目前为止我所尝试的:

map.rb
class Map

with all the methods in here (death(), central_corridor(), etc.)

然后

engine.rb
class Engine
require './map.rb'

  def initialize(start)
    @quips = [
      "You died. You kinda suck at this.",
      "Nice job, you died... jackass.",
      "Suck a luser."
    ]

    @start = start
    puts "in init @start = " + @start.inspect
  end

  def prompt()
    print "> "
  end

  def play()
    puts "@start => " + @start.inspect
    @next_room = @start

    while true
      puts "\n--------"
      room = method(@next_room)
      @next_room = room.call()
    end
  end

end

a_game = Engine.new(:central_corridor)
a_game.play()

所以基本上我所做的是获取用于游戏中“动作”的方法(房间、死亡等)并将它们放在 map.rb 中的类 Map 中,然后在我有我的类的 engine.rb 中调用具有“通用”方法/变量(如提示、播放、启动)的引擎。

我得到的错误是

engine.rb:24:in `method': undefined method `central_corridor' for class `Engine'

我理解这意味着 ruby​​ 试图在类引擎中找到一个方法“central_corridor”,但它在 map.rb 的类映射中,我不知道该怎么做,要么是一些变量修改,要么只是一些要添加的东西... :(

4

1 回答 1

2

问题是您没有 class 的实例Map,这是您需要能够调用central_corridor的。将此添加到initialize

@map=Map.new

并更改room = method(@next_room)room=@map.method(@next_room).


尽管这不是您的问题,但我有一种感觉,如果Map永远不会改变(您对地图中的所有内容都有方法),那么您将所有方法都设为类方法,然后将类Map用于您的地图。但是根据良好的设计原则,您可能应该使地图具有Hash代表区域的 lambda。这样,您可以拥有多个地图

于 2012-06-21T22:47:04.323 回答