ruby - 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_occupant
Room 类中的def check_in
实例方法?
我开始意识到房间是一个哈希值,它的值是房间类的实例变量。是因为我@rooms[room_name] = Room.new(capacity)
在我的初始化方法中定义了允许访问 Rooms 类吗?
解决方案
是因为我在我的初始化方法中定义了@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
哈希视为酒店登记簿。
推荐阅读
- windows - Docker Registry 没有自定义主机名
- sql - 在 SQLite 中按相反方向的两列排序
- angular - node_modules/@types/googlemaps/reference/event.d.ts(74,76) 中的错误:错误 TS2370:rest 参数必须是数组类型
- c# - Xamarin MvvmCross 如何将 NLog 用于 IMvxLogProvider?
- javascript - 导入与需要节点问题。我们不能使用导入来要求任何模块吗?
- c++ - 在 C++ 中调用辅助类的重写方法
- reactjs - 如何遍历 Axios 对 React 中表的响应
- pointers - 插件包中的 Lookup 返回什么?
- android - AndroidStudio 中的 ARCore 元数据错误
- csv - .CSV 中的重复记录 - 如何在重复中忽略 Hash 中的相似值并仅针对 Perl 中的不同值发出警告