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'
Un semplice 'super (o.is_a? (String)? O.downcase: o)' potrebbe essere un'idea migliore. –
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
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