【发布时间】:2020-03-19 15:59:19
【问题描述】:
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 预期 1)
符合规范的解决方案是rooms[room_name].add_occupant(person)
这如何允许从 Hotel 类中的 def check_in 实例方法访问 Room 类中的实例方法 def add_occupant?
我开始意识到房间是一个哈希值,它的值是房间类的实例变量。是因为我在我的初始化方法中定义了@rooms[room_name] = Room.new(capacity),它允许访问Rooms 类吗?
【问题讨论】:
-
请正确格式化您的问题以提高可读性。它可以帮助我们帮助您。请参阅“How do I format my posts...”。另请参阅“mcve”,因为看起来您可以减少示例代码。放入证明问题所需的最低限度。
-
对于琐碎的情况考虑使用
attr_reader。 -
“来自 Rooms 类的实例变量的值” – 只是“实例”,而不是“实例变量”。顺便说一句,从消息传递的角度考虑可能更容易。
hotel.check_in(...)将消息check_in发送到hotel对象。rooms将消息rooms发送到self(返回哈希),...[room_name]将消息[]发送到该哈希等。
标签: ruby class hash instance-variables