Dans une sous-classe Array (juste un tableau qui effectue une contrainte de valeurs d'entrée), j'ai défini #concat
pour m'assurer que les valeurs sont forcées. Puisque personne n'utilise jamais #concat
et est plus susceptible d'utiliser #+=
j'ai essayé d'alias #+=
à #concat
, mais il ne semble jamais être invoqué. Des idées? Notez que la coercition est en fait toujours aux objets d'une superclasse particulière (qui accepte l'entrée via le constructeur), au cas où ce code ne semble pas faire ce que je décris. Cela fait partie d'une API interne et privée.Essayer de redéfinir + = dans une sous-classe Array ne semble rien faire?
class CoercedArray < Array
def initialize(type)
super()
@type = type
end
def push(object)
object = @type.new(object) unless object.kind_of?(@type)
super
end
def <<(object)
push(object)
end
def concat(other)
raise ArgumentError, "Cannot append #{other.class} to #{self.class}<#{@type}>" unless other.kind_of?(Array)
super(other.inject(CoercedArray.new(@type)) { |ary, v| ary.push(v) })
end
alias :"+=" :concat
end
#concat
fonctionne correctement, mais #+=
semble être complètement contournée.
Je ne le savais pas, merci! Travaille maintenant :) – d11wtq