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/