From: nagachika00@... Date: 2014-01-23T12:41:11+00:00 Subject: [ruby-core:60026] [Backport200 - Backport #8872] [Closed] Case statements do not honor a refinement of the '===' method Issue #8872 has been updated by Tomoyuki Chikanaga. Status changed from Assigned to Closed Applied in changeset r44695. ---------- merge revision(s) 43913: [Backport #8872] [Backport #9175] * vm_insnhelper.c (check_match): Fix SEGV with VM_CHECKMATCH_TYPE_CASE and class of `pattern` has `method_missing` [Bug #8882] [ruby-core:58606] ---------------------------------------- Backport #8872: Case statements do not honor a refinement of the '===' method https://bugs.ruby-lang.org/issues/8872#change-44546 * Author: Jon Conley * Status: Closed * Priority: Normal * Assignee: Tomoyuki Chikanaga * Category: * Target version: * ruby -v: - ---------------------------------------- =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/