7

Kiedy zadzwonić Array#- to nie wydaje się, aby wywołać dowolną metodę porównawczą na strunach mam porównanie:W jaki sposób tablica # - (operator odejmowania) porównuje elementy pod kątem równości?

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} 

To właśnie powraca:

["one", "three"] 

Więc, co jest Array#- robi?

Również używam Ruby 1.9.2p290. W 1.8.7 wydaje się powodować nieskończoną pętlę.

+0

Spróbuj wywołać go za pomocą 'irb' (!). Po przeczytaniu definicji klasy przechodzi w nieskończoną pętlę. –

+1

@JoshLee Co masz na myśli mówiąc, że wchodzi w nieskończoną pętlę? Podczas wykonywania skryptu wysuwanego bez problemu – Zequez

+0

Drukuje się N == N == N m m m == N == N == m n M == N == l n w kółko ... –

Odpowiedz

5

source code for Array#-.

Wygląda na to, że zamiast sprawdzania pod kątem równości, hasz tworzony jest z drugiej tablicy. Wszystko, co nie jest zawarte w tej macierzy, jest przekazywane do wynikowej tablicy.

Różnica między tablicami w 1.8.7 jest również zaimplementowana w ten sposób. Zmiany w String tylko powodują problemy w irb (nie w prostym alfabecie rubinowym).

+0

Dobre wyjaśnienie. Tworzy również problemy w obsłudze ... – lucapette

+0

@lucapette: ah ok, prawdopodobnie każda replika będzie mieć problemy. – cam

+0

Ale jeśli nie testuje równości, to czy wie, czy coś jest zawarte w tablicy? Mam na myśli to, że w pewnym momencie musi sprawdzić równość? : | – Zequez

Powiązane problemy