6

caseステートメントで文字列とシンボルの両方と比較したいクラスがあるので、クラスの===()メソッドをオーバーライドするだけで、すべてがゴールドになると思いました。ただし、私の===()メソッドはcaseステートメントの実行中に呼び出されることはありません。何か案は?

以下にいくつかのサンプルコードと、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(main):010:0> a = A.new( "hi")
=>#
irb(main):011:0> case a
irb(main):012:1> when "hi" then 1
irb( main):013:1> else 2
irb(main):014:1> end
=> 2

(メッセージを出力することはなく、とにかく常にtrueを返す必要があります)理想的には、

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

前もって感謝します。

4

1 に答える 1

8

「case」キーワードの後の式は === 式の右側にあり、「when」キーワードの後の式は式の左側にあります。したがって、呼び出されているメソッドは A.=== ではなく String.=== です。

比較を逆にする簡単な方法:

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
于 2009-03-10T11:19:23.970 に答える