From: "shugo (Shugo Maeda)" Date: 2013-11-29T18:24:32+09:00 Subject: [ruby-core:58677] [Backport 200 - Backport #8872] Case statements do not honor a refinement of the '===' method Issue #8872 has been updated by shugo (Shugo Maeda). I strongly request committers not to change the behavior of Refinements without Matz's permission, except when there's an obvious bug such as SEGV in Refinements, because the current feature set of Refinements are restricted to keep compatibility with other implementations such as JRuby. In general, refinements should be activated only in a certain lexical scope. ---------------------------------------- Backport #8872: Case statements do not honor a refinement of the '===' method https://bugs.ruby-lang.org/issues/8872#change-43244 Author: jconley88 (Jon Conley) Status: Assigned Priority: Normal Assignee: matz (Yukihiro Matsumoto) Category: Target version: =begin Below, I've redefined the ((|===|)) method of symbol to always return true. In ((|RefineTest#uses_refinement|)), I call ((|===|)) directly and the refined method is called. In ((|RefineTest#does_not_use_refinement|)), the ((|===|)) method is called indirectly through a case statement. If the refined ((|===|)) method was called, the result should be ((*'The refinement was used'*)), but this code currently returns ((*'The refinement was not used'*)). module RefineSymbol refine Symbol do def ===(other) true end end end using RefineSymbol class RefineTest def uses_refinement :a === :b end def does_not_use_refinement case :a when :b 'The refinement was used' else 'The refinement was not used' end end end rt = RefineTest.new rt.uses_refinement # => true rt.does_not_use_refinement # => expected 'The refinement was used' but got 'The refinement was not used' =end -- http://bugs.ruby-lang.org/