ルビ大文字小文字の等価演算子をどのようにオーバーライドしますか(===)

StackOverflow https://stackoverflow.com/questions/629669

  •  08-07-2019
  •  | 
  •  

質問

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>ケース
  irb(main):012:1>いつ" hi&quot ;;次に1
  irb(main):013:1>その他2
  irb(main):014:1> end
  => 2

(メッセージを出力しないため、常にtrueを返す必要があります) 理想的には

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

事前に感謝します。

役に立ちましたか?

解決

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

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

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top