Project

General

Profile

Feature #12115

Updated by felixbuenemann (Felix Bünemann) about 8 years ago

I am a great fan of the `Symbol#to_proc` shorthand when mapping or reducing collections: 

 ```ruby 
 [1,2,16].map(&:to_s) 
 => ["1", "2", "16"] 
 [1,2,16].reduce(&:*) 
 => 32 
 ``` 

 I often wish it would be possible to pass an argument to the method when doing this, which currently requires a block and is more verbose: 

 ```ruby 
 [1,2,16].map { |n| n.to_s(16) } 
 => ["1", "2", "10"] 
 # active_support example 
 {id: 1, parent_id: nil}.as_json.transform_keys { |k| k.camelize :lower }.to_json 
 => '{"id":1,"parentId":null}' 
 ``` 

 It would be much shorter, if ruby allowed this: 

 ```ruby 
 [1,2,16].map(&:to_s.(16)) 
 => ["1", "2", "10"] 
 # active_support example 
 {id: 1, parent_id: nil}.as_json.transform_keys(&:camelize.(:lower)).to_json 
 => '{"id":1,"parentId":null}' 
 ``` 

 This can be implemented easily, by adding the `Symbol#call` method: 

 ```ruby 
 class Symbol 
   def call(*args, **kwargs, &block) 
     ->(caller, *rest) { caller.send(self, *rest, *args, **kwargs, &block) } 
   end 
 end 

 
 ``` 

 *Source*: [stackoverflow: Can you supply arguments to the map(&:method) syntax in Ruby?](http://stackoverflow.com/questions/23695653/can-you-supply-arguments-to-the-mapmethod-syntax-in-ruby) (and adapted for kwargs) 

 **I think this is a rather common use case, so I propose to add `Symbol#call` to the Ruby standard library.**

Back