【问题标题】:Ruby. Says full_description is undefined even though it's defined in the child class Room. How do I fix this?红宝石。说 full_description 是未定义的,即使它是在子类 Room 中定义的。我该如何解决?
【发布时间】:2016-05-17 17:40:17
【问题描述】:
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)

【问题讨论】:

    标签: ruby methods call subclass


    【解决方案1】:

    最终,您的问题相当于一个错字:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      相关资源
      最近更新 更多