Frage

Ich habe eine Klasse, die ich beide Saiten und Symbole in einem Fall Aussage vergleichen wollen, so dachte ich, dass ich außer Kraft setzen nur die === () -Methode für meine Klasse und alles Gold sein würde. Jedoch meine === () Methode nie während der Case-Anweisung aufgerufen wird. Irgendwelche Ideen?

Hier ist ein Beispiel-Code, und was passiert in einer irb Sitzung:

class A
   def initialize(x)
      @x=x #note this isn't even required for this example
   end
   def ===(other)
      puts "in ==="
      return true
   end
end
  

irb (main): 010: 0> a = A.new ( "hallo")
  => #
  irb (main): 011: 0> Fall ein
  irb (main): 012: 1>, wenn "hallo", dann 1 |   irb (main): 013: 1> sonst 2
  irb (main): 014: 1> Ende
  => 2

(druckt er nie die Nachricht und sollte immer true zurück sowieso) Beachten Sie, dass im Idealfall würde Ich mag ein tun

def ===(other)
          #puts "in ==="
          return @x.===(other)
end

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Der Ausdruck nach dem ‚Fall‘ Schlüsselwort ist die rechte Seite des === Ausdrucks und der Ausdruck nach dem ‚wann‘ Schlüsselwort ist auf der linken Seite des Ausdrucks. So ist die Methode, die aufgerufen wird, ist String. ===, nicht A. ===.

Eine schnelle Annäherung an die Umkehr der Vergleich:

class Revcomp
    def initialize(obj)
        @obj = obj
    end

    def ===(other)
        other === @obj
    end

    def self.rev(obj)
        Revcomp.new(obj)
    end
end

class Test
    def ===(other)
        puts "here"
    end
end

t = Test.new

case t
when Revcomp.rev("abc")
    puts "there"
else
    puts "somewhere"
end
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top