首页 > 解决方案 > Ruby 访问另一个类的实例方法

问题描述

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 add_occupantRoom 类中的def check_in实例方法?

我开始意识到房间是一个哈希值,它的值是房间类的实例变量。是因为我@rooms[room_name] = Room.new(capacity)在我的初始化方法中定义了允许访问 Rooms 类吗?

标签: rubyclasshashinstance-variables

解决方案


是因为我在我的初始化方法中定义了@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

正如我们看到的putsrooms[room_name]返回一个实例Room,因此我们可以调用该add_occupant方法。

rooms哈希视为酒店登记簿。


推荐阅读