class Room #room.rb
def initialize(capacity)
@capacity = capacity
@occupants = []
end
def capacity
@capacity
end
def occupants
@occupants
end
def full?
return false if occupants.length < capacity
return true if occupants.length == capacity
end
def add_occupant(name)
if !self.full?
occupants << name
return true
end
return false
end
end
#hotel.rb
require_relative "room"
class Hotel
def initialize(name, hash)
@rooms = {}
hash.each do |room_name,capacity|
@rooms[room_name] = Room.new(capacity)
end
end
def rooms
@rooms
end
def check_in(person, room_name)
open_room = rooms[room_name].add_occupant(person)
end
end
hotel = Hotel.new("some hotel", "Basement"=>4, "Attic"=>1)
rooms = hotel.instance_variable_get(:@rooms)
hotel.check_in("Rick", "Attic")
在def check_in
实例方法中,规范要求在正确的Room实例上调用Room#add_occupant。
我的最初想法是为add_occupants定义Room.new,因此我使用了rooms[room_name] = Rooms.new.add_occupants(person)
。但是,由于参数(给定预期值为0,因此无法使用)]
符合规格的解决方案是rooms[room_name].add_occupant(person)
这如何允许从酒店类的def add_occupant
实例方法访问“房间”类的实例方法def check_in
?
我已经意识到,房间是一个散列,其值是Rooms类的实例变量。是因为我在初始化方法中定义了@rooms[room_name] = Room.new(capacity)
,该方法允许访问Rooms类吗?
是因为我在初始化方法中定义了@rooms [room_name] = Room.new(capacity),该方法允许访问Rooms类?
没错,您了解:)
如果添加一些日志记录,很容易看到..
def check_in(person, room_name)
puts rooms[room_name].class # => Room
open_room = rooms[room_name].add_occupant(person)
end
正如我们在puts
中看到的,rooms[room_name]
返回Room
的实例,因此允许我们调用add_occupant
方法。
考虑rooms
哈希作为酒店登记簿。