7

Cuando llamo Array#- que no parece llamar a cualquier método de comparación en las cuerdas estoy comparando:¿Cómo combina Array # - (operador de resta) elementos para la igualdad?

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} 

simplemente devuelve:

["one", "three"] 

Entonces, ¿qué está haciendo Array#-?

Además, estoy usando Ruby 1.9.2p290. En 1.8.7 parece causar un bucle infinito.

+0

Intenta invocarlo con 'irb' (!). Después de leer la definición de su clase, entra en un ciclo infinito. –

+1

@JoshLee ¿Qué quieres decir con que entra en un ciclo infinito? Cuando ejecuto el guión que salga sin ningún problema – Zequez

+0

Se imprime N == N N == == m m m N == == n m n M == == l n n una y otra vez ... –

Respuesta

5

source code for Array#-.

Parece que en lugar de probar la igualdad, se crea un hash a partir del segundo conjunto. Todo lo que no está contenido en esa matriz se inserta en la matriz resultante.

La diferencia de matriz en 1.8.7 también se implementa de esta manera. Los cambios a String solo causan problemas en irb (no en un script simple de ruby).

+0

Buena explicación. También crea problemas en la palanca ... – lucapette

+0

@lucapette: ah ok, probablemente cualquier respuesta tendrá problemas. – cam

+0

Pero si no está probando la igualdad, ¿cómo sabe si algo está contenido en la matriz? Quiero decir, tiene que probar la igualdad en algún momento, ¿verdad? : | – Zequez

Cuestiones relacionadas