[ruby-cvs:71429] usa:r64337 (trunk): Support optional inherit argument for Module#method_defined?

usa at ruby-lang.org usa at ruby-lang.org
Mon Aug 13 21:42:03 JST 2018


usa	2018-08-13 21:42:03 +0900 (Mon, 13 Aug 2018)

  New Revision: 64337

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=64337

  Log:
    Support optional inherit argument for Module#method_defined?
    
    Module has many introspection methods for methods and constants that
    either return an array or return true or false for whether the method
    or constant is defined. Most of these methods support an optional
    argument that controls whether to consider inheritance.  Currently,
    the following Module methods support such a argument:
    
    * const_defined?
    * constants
    * instance_methods
    * private_instance_methods
    * protected_instance_methods
    * public_instance_methods
    
    and the following methods do not:
    
    * method_defined?
    * private_method_defined?
    * protected_method_defined?
    * public_method_defined?
    
    This patch supports such an argument for the *method_defined?
    methods.
    
    While you can currently work around the lack of support via:
    
      mod.instance_methods(false).include?(:method_name)
    
    This patch allows the simpler and more efficient:
    
      mod.method_defined?(:method_name, false)
    
    One case where you want to exclude inheritance when checking
    for a method definition is when you want to replace a method
    that may already exist.  To avoid a verbose warning, you want
    to remove the method only if it is already defined:
    
      remove_method(:foo) if method_defined?(:foo, false)
      define_method(:foo){}
    
    You can't call remove_method without checking for the method
    definition, as that can raise a NameError, and you don't want
    to include inheritance because remove_method will still raise
    a NameError if the method is defined by an ancestor and not
    by the module itself.
    
    [ruby-core:88140] [Feature #14944]
    
    From: Jeremy Evans <code at jeremyevans.net>

  Modified files:
    trunk/test/ruby/test_module.rb
    trunk/vm_method.c


More information about the ruby-cvs mailing list