ルビ大文字小文字の等価演算子をどのようにオーバーライドしますか(===)
-
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
所属していません StackOverflow