Question

J'ai une classe que je veux comparer aux chaînes et aux symboles dans une instruction case, alors je pensais que je substituais simplement la méthode === () à ma classe et que tout serait doré. Cependant, ma méthode === () n'est jamais appelée au cours de l'instruction case. Des idées?

Voici un exemple de code et ce qui se passe dans une session irb:

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 (principal): 010: 0 > a = A.new ("hi")
  = > #
  irb (principal): 011: 0 > cas a
  irb (principal): 012: 1 > quand " salut " alors 1
  irb (principal): 013: 1 > sinon 2
  irb (principal): 014: 1 > fin
  = > 2

(il n'imprime jamais le message et doit toujours retourner true de toute façon) Notez qu'idéalement, j'aimerais faire une

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

Merci d'avance.

Était-ce utile?

La solution

L'expression après le mot clé "case" est le côté droit de l'expression ===, et l'expression après le mot clé "quand" est située à gauche de l'expression. Ainsi, la méthode appelée est String. ===, pas A. ===.

Une approche rapide pour inverser la comparaison:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top