我的目錄中有兩個檔案,一個是garage.rb& 另一個叫做car.rb.
car.rb檔案只包含一個汽車物件:
class Car
end
garage.rb檔案如下:
require 'car.rb' #Makes car class accessible in garage.rb
class Garage
def initialize
@capacity = []
end
attr_accessor :capacity
end
car當我通過呼叫創建 a 的新實體時car = Car.new,如何將car物件放入@capacity我的默認陣列中?
本質上,每當我打電話時car = Car.new,我都想car立即被放入@capacity陣列中。
我知道我可以制作這樣的功能:
def add_car_to_garage(car)
capacity << car
end
但是,我希望汽車在創建時在車庫中啟動,所以我不想要將它添加到陣列中的方法,我只希望它在car創建實體時自動啟動。
任何意見,將不勝感激。謝謝你。
uj5u.com熱心網友回復:
您可以在類中使用帶有each_object方法的ObjectSpace模塊來定義方法來跟蹤每個活動實體,如下所示:Car
class Car
def self.all
ObjectSpace.each_object(self).to_a
end
end
require_relative 'car' # Makes car class accessible in garage.rb
class Garage
def initialize
@capacity = Car.all
end
attr_accessor :capacity
end
car1 = Car.new
car2 = Car.new
car3 = Car.new
garage = Garage.new
print garage.capacity # => [#<Car:0x0000563fa14128c8>, #<Car:0x0000563fa1412918>, #<Car:0x0000563fa1412990>]
另請注意,我曾經require_relative包含car.rb在同一目錄中的類。
編輯評論問題和 Cary Swoveland 建議:
class Car
end
require_relative 'car' # Makes car class accessible in garage.rb
class Garage
def initialize; end
def capacity
ObjectSpace.each_object(Car).to_a
end
end
car1 = Car.new
garage = Garage.new
car2 = Car.new
print garage.capacity # => [#<Car:0x000055d7bd236a00>, #<Car:0x000055d7bd236b18>]
另請注意,我洗掉了attr_accessor :capacity,因為在這種情況下您不需要它。
uj5u.com熱心網友回復:
的實體集合Car應由該類保存和維護,并根據需要提供給其他類。這可以按如下方式完成。
class Car
@cars = []
class << self
attr_reader :cars
end
def initialize
self.class.cars << self
end
def self.remove_car(car)
cars.delete(car)
end
end
class Garage
def self.cars
Cars.cars
end
end
類的創建Car初始化了類實體變數@cars并為其創建了一個 getter,Cars::cars后者通過呼叫attr_reader的Car單例類。
讓我們創建一輛車:
car1 = Car.new
#=> #<Car:0x00007fcf3db76fd8>
然后
Car.cars
#=> [#<Car:0x00007fcf3db76fd8>]
Garage.cars
#=> [#<Car:0x00007fcf3db76fd8>]
再造一輛車。?
car2 = Car.new
#=> #<Car:0x00007fcf3db5c9a8>
然后
Car.cars
#=> [#<Car:0x00007fcf3db76fd8>, #<Car:0x00007fcf3db5c9a8>]
Garage.cars
#=> [#<Car:0x00007fcf3db76fd8>, #<Car:0x00007fcf3db5c9a8>]
現在移除一輛車。
Car.remove_car(car1)
#=> #<Car:0x00007fcf3db76fd8>
然后
Car.cars
#=> [#<Car:0x00007fcf3db5c9a8>]
Garage.cars
#=> [#<Car:0x00007fcf3db5c9a8>]
要使類實體變數@cars可用于Garage添加一個簡單實體方法的實體:
class Garage
def all_cars
self.class.cars
end
end
Garage.new.all_cars
#=> [#<Car:0x00007fcf3db5c9a8>]
在Car
class << self
attr_reader :cars
end
也可以寫成
singleton_class.public_send(:attr_reader, :cars)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/463605.html
上一篇:滾動固定標題故障
下一篇:未處理的例外:型別“List<dynamic>”不是“List<imageObject>”型別的子型別?|如何在顫動的模型firebase中輸入物件陣列
