2011-10-10 2 views
1

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.

Répondre

5

Depuis a += b est le sucre syntaxique pour a = a + b Je voudrais essayer d'écraser la méthode +.

+0

Je ne le savais pas, merci! Travaille maintenant :) – d11wtq

Questions connexes