【问题标题】:Ruby access instance method from another classRuby 访问另一个类的实例方法
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 2012-12-18
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多