mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	[ruby/forwardable] Make def_*_delegator return name of method defined (Fixes #10)
This restores compatibility with previous versions.  This behavior
was previously undefined, but it makes sense for the name of the
defined method to be returned.
a52ef3451e
			
			
This commit is contained in:
		
							parent
							
								
									c2f6aa4e48
								
							
						
					
					
						commit
						0dcd3340fb
					
				
					 2 changed files with 12 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -160,6 +160,7 @@ module Forwardable
 | 
			
		|||
  # +accessor.method+.  +accessor+ should be a method name, instance
 | 
			
		||||
  # variable name, or constant name.  Use the full path to the
 | 
			
		||||
  # constant if providing the constant name.
 | 
			
		||||
  # Returns the name of the method defined.
 | 
			
		||||
  #
 | 
			
		||||
  #   class MyQueue
 | 
			
		||||
  #     CONST = 1
 | 
			
		||||
| 
						 | 
				
			
			@ -184,8 +185,9 @@ module Forwardable
 | 
			
		|||
 | 
			
		||||
    # If it's not a class or module, it's an instance
 | 
			
		||||
    mod = Module === self ? self : singleton_class
 | 
			
		||||
    mod.module_eval(&gen)
 | 
			
		||||
    ret = mod.module_eval(&gen)
 | 
			
		||||
    mod.send(:ruby2_keywords, ali) if RUBY_VERSION >= '2.7'
 | 
			
		||||
    ret
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  alias delegate instance_delegate
 | 
			
		||||
| 
						 | 
				
			
			@ -299,11 +301,13 @@ module SingleForwardable
 | 
			
		|||
  # Defines a method _method_ which delegates to _accessor_ (i.e. it calls
 | 
			
		||||
  # the method of the same name in _accessor_).  If _new_name_ is
 | 
			
		||||
  # provided, it is used as the name for the delegate method.
 | 
			
		||||
  # Returns the name of the method defined.
 | 
			
		||||
  def def_single_delegator(accessor, method, ali = method)
 | 
			
		||||
    gen = Forwardable._delegator_method(self, accessor, method, ali)
 | 
			
		||||
 | 
			
		||||
    instance_eval(&gen)
 | 
			
		||||
    ret = instance_eval(&gen)
 | 
			
		||||
    singleton_class.send(:ruby2_keywords, ali) if RUBY_VERSION >= '2.7'
 | 
			
		||||
    ret
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  alias delegate single_delegate
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,11 +24,13 @@ class TestForwardable < Test::Unit::TestCase
 | 
			
		|||
 | 
			
		||||
  def test_def_instance_delegator
 | 
			
		||||
    %i[def_delegator def_instance_delegator].each do |m|
 | 
			
		||||
      ret = nil
 | 
			
		||||
      cls = forwardable_class do
 | 
			
		||||
        __send__ m, :@receiver, :delegated1
 | 
			
		||||
        ret = __send__ m, :@receiver, :delegated1
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      assert_same RETURNED1, cls.new.delegated1
 | 
			
		||||
      assert_equal :delegated1, ret
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -185,11 +187,13 @@ class TestForwardable < Test::Unit::TestCase
 | 
			
		|||
 | 
			
		||||
  def test_class_single_delegator
 | 
			
		||||
    %i[def_delegator def_single_delegator].each do |m|
 | 
			
		||||
      ret = nil
 | 
			
		||||
      cls = single_forwardable_class do
 | 
			
		||||
        __send__ m, :@receiver, :delegated1
 | 
			
		||||
        ret = __send__ m, :@receiver, :delegated1
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      assert_same RETURNED1, cls.delegated1
 | 
			
		||||
      assert_equal :delegated1, ret
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue