来自另一个类的Ruby访问实例方法

来自另一个类的Ruby访问实例方法,ruby,class,hash,instance-variables,Ruby,Class,Hash,Instance Variables,在def check_In实例方法中,规范要求呼叫室#在正确的房间实例上添加居住者 我的第一个想法是为添加居住者定义Room.new,所以我使用房间[Room\u name]=rooms.new.add\u居住者(person)。但是,由于参数的原因,这将不起作用(假定0预期为1) 符合规范的解决方案是房间[房间名称]。添加居住者(人) 这如何允许从Hotel类中的def check\u-in实例方法访问房间类中的实例方法def add\u accounter 我逐渐意识到rooms是一个散列,

def check_In
实例方法中,规范要求呼叫室#在正确的房间实例上添加居住者

我的第一个想法是为添加居住者定义Room.new,所以我使用
房间[Room\u name]=rooms.new.add\u居住者(person)
。但是,由于参数的原因,这将不起作用(假定0预期为1)

符合规范的解决方案是
房间[房间名称]。添加居住者(人)

这如何允许从Hotel类中的
def check\u-in
实例方法访问房间类中的实例方法
def add\u accounter

我逐渐意识到rooms是一个散列,其值是rooms类中的实例变量。是因为我在initialize方法中定义了
@rooms[room\u name]=room.new(capacity)
,允许访问rooms类吗

是不是因为我在initialize方法中定义了@rooms[room\u name]=room.new(capacity),它允许访问rooms类

没错,你明白:)

如果我们添加一些日志,很容易看到

#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")

正如我们在
put
中看到的那样,
rooms[rooms\u name]
返回
rooms
的一个实例,因此我们可以调用
add\u accounter
方法


房间
散列作为酒店登记簿。

为了便于阅读,请正确设置问题的格式。它帮助我们帮助你。见“”。另请参见“”,因为它看起来可以减少示例代码。将最小的问题放在演示中。对于琐碎的情况,考虑使用“来自房间类的实例变量的值”——仅仅是“实例”,而不是“实例变量”。顺便说一句,从消息传递的角度考虑可能更容易<代码>酒店。签入(…)将消息
签入
发送到
酒店
对象
rooms
将消息
rooms
发送到
self
(返回哈希),
…[rooms\u name]
将消息
[]
发送到该哈希等。
#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(person, room_name)
        puts rooms[room_name].class # => Room
        open_room = rooms[room_name].add_occupant(person)
    end