J'ai 3 classes simples CashRegister, Bill et Position. Un CashRegister est composé d'objets Bill et un objet Bill est composé d'objets Position. Ils sont implémentés comme suitMéthodes pour créer une copie profonde des objets sans l'aide du Maréchal
class CashRegister
def initialize
@bills = []
end
def clone
#?
end
end
class Bill
def initialize(nr)
@nr = nr
@positions = []
end
def clone
#?
end
end
class Position
def initialize(product, price)
@product = product
@price = price
end
def clone
#?
end
end
Comment créer des méthodes pouvant copier en profondeur les objets de ces classes. L'utilisation de Marshal.load(Marshal.dump(an_obj))
n'est pas autorisée.
Edit: Jusqu'à présent, j'ai ceci:
class CashRegister
def initialize
@bills = []
end
def clone
@bills.map { |bill| bill.clone}
end
end
class Bill
def initialize(nr)
@nr = nr
@positions = []
end
def clone
cloned = super
cloned.positions = @positions.map{ |pos| pos.clone}
cloned
end
end
class Position
attr_reader :preis
# this method is given
def produkt
@produkt.clone()
end
def initialize(product, price)
@product = product
@price = price
end
def clone
cloned = super
cloned.product
cloned
end
end
La méthode clone en position de classe semble être ok (pas d'erreur de compilation). Mais il y a une erreur dans le projet de loi en classe, il est dit "position indéfinie" = ", donc le problème doit être sur la ligne cloned.positions = @positions.map{ |pos| pos.clone}
." Mais je ne comprends pas, ne pouvons-nous pas appeler cloned.positions
comme ça?