From 8b0a3a21133b1c858440ecd77bf7c3a76504ec0d Mon Sep 17 00:00:00 2001 From: Akira Matsuda Date: Thu, 29 Dec 2022 12:04:08 +0900 Subject: [PATCH] Let DelegateClass respect the original method's arity in case of 0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This defines 37% faster method when it takes no argument. Benchmark: Warming up -------------------------------------- old 551.697k i/100ms new 721.906k i/100ms Calculating ------------------------------------- old 6.511M (± 0.8%) i/s - 33.102M in 5.084530s new 8.925M (± 1.0%) i/s - 44.758M in 5.015619s Comparison: new: 8924652.2 i/s old: 6510691.1 i/s - 1.37x (± 0.00) slower --- lib/delegate.rb | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/lib/delegate.rb b/lib/delegate.rb index 387a5f0..dcb95ff 100644 --- a/lib/delegate.rb +++ b/lib/delegate.rb @@ -343,11 +343,18 @@ def __setobj__(obj) end end -def Delegator.delegating_block(mid) # :nodoc: - lambda do |*args, &block| - target = self.__getobj__ - target.__send__(mid, *args, &block) - end.ruby2_keywords +def Delegator.delegating_block(mid, arity = nil) # :nodoc: + if arity != 0 + lambda do |*args, &block| + target = self.__getobj__ + target.__send__(mid, *args, &block) + end.ruby2_keywords + else + lambda do |&block| + target = self.__getobj__ + target.__send__(mid, &block) + end + end end # @@ -411,11 +418,13 @@ def __setobj__(obj) # :nodoc: @delegate_dc_obj = obj end protected_instance_methods.each do |method| - define_method(method, Delegator.delegating_block(method)) + arity = superclass.instance_method(method).arity + define_method(method, Delegator.delegating_block(method, arity)) protected method end public_instance_methods.each do |method| - define_method(method, Delegator.delegating_block(method)) + arity = superclass.instance_method(method).arity + define_method(method, Delegator.delegating_block(method, arity)) end end klass.define_singleton_method :public_instance_methods do |all=true|