7

Quando chiamo Array#- che non sembra per chiamare qualsiasi metodo di confronto sulle corde sto paragonando:In che modo Array # - (operatore di sottrazione) confronta gli elementi per l'uguaglianza?

class String 
    def <=>(v) 
    puts "#{self} <=> #{v}" 
    super(v) 
    end 

    def ==(v) 
    puts "#{self} == #{v}" 
    super(v) 
    end 

    def =~(v) 
    puts "#{self} =~ #{v}" 
    super(v) 
    end 

    def ===(v) 
    puts "#{self} == #{v}" 
    super(v) 
    end 

    def eql?(v) 
    puts "#{self}.eql? #{v}" 
    super(v) 
    end 

    def equal?(v) 
    puts "#{self}.equal? #{v}" 
    super(v) 
    end 

    def hash() 
    puts "#{self}.hash" 
    super 
    end 
end 

p %w{one two three} - %w{two} 

Si restituisce solo:

["one", "three"] 

Quindi, qual è Array#- facendo?

Inoltre, sto usando Ruby 1.9.2p290. In 1.8.7 sembra causare un loop infinito.

+0

Provare a richiamarlo con 'irb' (!). Dopo aver letto la definizione della classe, passa ad un ciclo infinito. –

+1

@JoshLee Cosa vuoi dire che entra in un ciclo infinito? Quando eseguire lo script esce senza alcun problema – Zequez

+0

esso stampa N == N N == m m == m N == n m == n M == n l == n più e più volte ... –

risposta

5

source code for Array#-.

Sembra che anziché eseguire il test per l'uguaglianza, viene eseguito un hash dal secondo array. Tutto ciò che non è contenuto in quell'array viene inserito nell'array risultante.

La differenza di array in 1.8.7 è implementata anche in questo modo. Le modifiche a String causano solo problemi in irb (non in un semplice script ruby).

+0

Bella spiegazione. Crea problemi anche in preda ... – lucapette

+0

@lucapette: ah ok, probabilmente ogni repl avrà problemi. – cam

+0

Ma se non sta testando l'uguaglianza, come fa a sapere se qualcosa è contenuto nell'array? Voglio dire, deve testare l'uguaglianza ad un certo punto, giusto? : | – Zequez