2012-12-21 10 views
7

Nel tentativo di rispondere a questa domanda: How can I make the set difference insensitive to case?, stavo sperimentando set e stringhe, cercando di avere un set di stringhe insensibile alle maiuscole. Ma per qualche motivo quando riapuro la classe String, nessuno dei miei metodi personalizzati viene invocato quando aggiungo una stringa a un set. Nel codice seguente non vedo output, ma mi aspettavo che almeno uno degli operatori che ho sovraccaricato fosse invocato. Perchè è questo?un set di stringhe e riapertura Stringa

MODIFICA: Se creo una classe personalizzata, ad esempio, String2, dove definisco un metodo hash, ecc., Questi metodi vengono richiamati quando aggiungo il mio oggetto a un set. Perché non stringa?

require 'set' 

class String 
    alias :compare_orig :<=> 
    def <=> v 
    p '<=>' 
    downcase.compare_orig v.downcase 
    end 

    alias :eql_orig :eql? 
    def eql? v 
    p 'eql?' 
    eql_orig v 
    end 

    alias :hash_orig :hash 
    def hash 
    p 'hash' 
    downcase.hash_orig 
    end 
end 

Set.new << 'a' 

risposta

4

Guardando il source code per Set, utilizza un semplice hash per lo stoccaggio:

def add(o) 
    @hash[o] = true 
    self 
end 

così sembra che ciò che è necessario fare, invece di apertura String è aperto Set. Non ho ancora testato questo, ma dovrebbe dare l'idea giusta:

class MySet < Set 
    def add(o) 
    if o.is_a?(String) 
     @hash[o.downcase] = true 
    else 
     @hash[o] = true 
    end 
    self 
    end 
end 

Modifica

Come notato nei commenti, questo può essere implementato in un modo molto più semplice:

class MySet < Set 
    def add(o) 
    super(o.is_a?(String) ? o.downcase : o) 
    end 
end 
+1

Un semplice 'super (o.is_a? (String)? O.downcase: o)' potrebbe essere un'idea migliore. –

+0

grazie. funziona, si. Se creo una classe personalizzata, ad esempio, String2, dove definisco un metodo hash, ecc., Questi metodi vengono richiamati quando aggiungo il mio oggetto a un set. Perché? (Ho modificato la mia domanda). – akonsu

+0

Ruby source (https://github.com/ruby/ruby/blob/trunk/hash.c#L1195) potrebbe dare un indizio. Sembra che 'String's ottenga un trattamento speciale come chiavi hash nella risonanza magnetica. – Luke

Problemi correlati