Ruby。说 full_description 是未定义的,即使它是在子 class 房间中定义的。我该如何解决?

Ruby. Says full_description is undefined even though it's defined in the child class Room. How do I fix this?

class Dungeon
  attr_accessor :player

  def initialize(player_name)
    @player = Player.new(player_name)
    @rooms = []
  end

  def add_room(reference, name, description, connections)
    @rooms << Room.new(reference, name, description, connections)
  end

  def start(location)
    @player.location = location
    show_current_description
  end

  def show_current_description

    puts find_room_in_dungeon(@player.location).full_description
  end

  def find_room_in_dungeon(reference)
    @rooms.detect { |room| room.reference == reference}
  end

  def find_room_in_direction(direction)
    find_room_in_dungeon(@player.location).connections[direction]
  end

  def go(direction)
    puts "You go " + direction.to_s
    @player.location = find_room_in_direction(direction)
    show_current_description
  end

  class Player
    attr_accessor :name, :location

    def initialize(name)
      @name = name
    end
  end

  class Room
    attr_accessor :reference, :name, :description, :connections

    def initialize(reference, name, description, connections)
      @reference = reference
      @name = name
      @description = description
      @connections = connections
    end

    def full_description
      @name + "\n\nYou are in " + @description
    end
  end

end

# Create the main dungeon object
my_dungeon = Dungeon.new("Freed Bloggs")

# Add rooms to the Dungeon
my_dungeon.add_room(:largecae, "Large Cave", "a large cavernous cave", {:west => :smallcave})
my_dungeon.add_room(:smallcave, "Small Cave", "a small, claustrophobic cave", {:east => :largecave})

# Start the dungeon by placing the player in the large cave
my_dungeon.start(:largecave)

最终,您的问题属于拼写错误:

my_dungeon.add_room(:largecae, "Large Cave", "a large cavernous cave", {:west => :smallcave})

您添加了一个名为 :largecae 的房间,然后称为 my_dungeon.start(:largecave) — 请注意名字中缺少的 "v"。

show_current_description 调用 find_room_in_dungeon(@player.location) 时,结果是 nil,所以你在 nil 上调用 full_description

授人以渔,只需 运行 代码并查看完整错误即可得出答案:

$ ruby /tmp/test.rb
/tmp/test.rb:19:in `show_current_description': undefined method `full_description' for nil:NilClass (NoMethodError)
        from /tmp/test.rb:15:in `start'
        from /tmp/test.rb:69:in `<main>'

请注意,错误告诉您 full_description 未定义 nil,而不是 Room