2

クラスの仕組みと作成方法は理解していますが、演習の 2 番目の追加クレジットでは、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'

ルビーがクラスエンジンでメソッド「central_corridor」を見つけようとすることを意味していることは理解していますが、それはmap.rbのクラスマップにあり、何をすべきかわかりません.変数の変更か、追加するものだけです. ... :(

4

1 に答える 1

2

問題は、クラスのインスタンスがないことですMap。これは、を呼び出すことができるようにするために必要なものですcentral_corridorinitializeこれを:に追加します

@map=Map.new

そしてに変更room = method(@next_room)room=@map.method(@next_room)ます。


これはあなたの質問ではありませんが、Map変更されない場合(マップ内のすべてのメソッドがあります)、すべてのメソッドをクラスメソッドにしMapて、マップのクラスを使用するだけだと思います。ただし、優れた設計原則により、マップHashにエリアを表すラムダを含める必要があります。そうすれば、複数のマップを持つことができます

于 2012-06-21T22:47:04.323 に答える