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

问题描述 投票:0回答:1
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类吗?

ruby class hash instance-variables
1个回答
0
投票

是因为我在初始化方法中定义了@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哈希作为酒店登记簿。

© www.soinside.com 2019 - 2024. All rights reserved.