From: merch-redmine@... Date: 2019-06-21T16:37:58+00:00 Subject: [ruby-core:93302] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection Issue #14252 has been updated by jeremyevans0 (Jeremy Evans). Status changed from Open to Closed Ruby 2.6.0 started honoring refinements in `Kernel#public_send`. ---------------------------------------- Bug #14252: Refined Method Visibility Lost with Dynamic Dispatch and Reflection https://bugs.ruby-lang.org/issues/14252#change-78774 * Author: sonnym (Sonny Michaud) * Status: Closed * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux] * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN ---------------------------------------- Consider the following simple objects, one with a protected class method and another with a public class method calling on the protected method. This is accomplished using a refinement that marks the method as public on the singleton class of the original object. ~~~ ruby class Protected class << self protected def print :protected end end end module Publicize refine Protected.singleton_class do public :print end end class Public using Publicize def self.print Protected.public_methods.include?(:print) # false Protected.protected_methods.include?(:print) # true Protected.print # works Protected.public_send(:print) # fails end end Public.print ~~~ This works perfectly well for the static `Protected.print` call, but has a number of surprises when trying to do anything more advanced. Namely: * Attempting to call the method with refined visibility raises a `NoMethodError` * The method appears in the `protected_methods` list of the original object * The method does not appear in the `public_methods` list of the original object As a user, I would expect all those things to be not the case, since, if I opened the class directly and changed the visibility of the method, those three items would no longer be true. -- https://bugs.ruby-lang.org/ Unsubscribe: