Project

General

Profile

Feature #13332

Updated by nobu (Nobuyoshi Nakada) over 7 years ago

I'd like to suggest an extension to the signature of stdlib Forwardable#def_instance_delegator 

 currently (ruby 2.3.3) it is declared as: 

 ```ruby 
   def_instance_delegator(accessor, method, ali = method) 
 ``` 

 I'd like to add a nil: option like this: 

 ```ruby 
   def_instance_delegator(accessor, method, ali = method, nil_behaviour:NoMethodError) 
 ``` 

 Rationale: 
 As of ruby2.3, delegated methods fail with 
   `#<NoMethodError: #<NoMethodError: undefined method `foo' for nil:NilClass>` nil:NilClass> 
 when the declared accessor returns nil 

 aka, when the delegator may be nil, 
 the Forwardable module can not be used, 
 but one has to ressort to implement the forward manually. 

 Adding an option to the signature could solve this. 
 I believe that this can be implemented in a fully backward compatible way. 

 I named this option :nil in my example, 
 (some people will cry out loud) 

 Specification scribble: 

 ~~~ruby 
 ~~~ 
 if accessor.nil? 
   case nil_behaviour 
   when nil then nil      # return nil, when accessor was nil 
   when Error               # raise that Error with proper args 
   when Proc               # invoke that Proc with proper args 
   when String             # return that string 
   else                          # return that object 
 end 
 ~~~ 



























Back