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
。
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
。