Issue #7297 has been updated by john_firebaugh (John Firebaugh).


john_firebaugh (John Firebaugh) wrote:
> I reviewed my own use of Hash[], and in the majority of cases, I'm transforming both the key and value. So I would prefer a more flexible definition:
> 
> module Enumerable
>   # Associates keys with values and returns a Hash.
>   #
>   # If you have an enumerable of keys and want to associate them with values,
>   # pass a block that returns a value for the key:
>   #
>   #   %w( tender love ).associate { |n| [n, n.capitalize] }
>   #   # => {"tender"=>"Tender", "love"=>"Love"}
>   #
>   #   [1, 2, 3].associate { |i| [i * 2, i ** 2] }
>   #   # => { 2 => 1, 4 => 4, 6 => 9 }
>   #
>   # If you have an enumerable key/value pairs and want to associate them,
>   # omit the block and you'll get a hash in return:
>   #
>   #   [[1, 2], [3, 4]].associate
>   #   # => { 1 => 2, 3 => 4 }
>   def associate(mapping = {})
>     if block_given?
>       each_with_object(mapping) do |key, object|
>         key, value = yield(key)
>         object[key] = value
>       end
>     else
>       each_with_object(mapping) do |(key, value), object|
>         object[key] = value
>       end
>     end
>   end
> end


----------------------------------------
Feature #7297: map_to alias for each_with_object
https://bugs.ruby-lang.org/issues/7297#change-32579

Author: nathan.f77 (Nathan Broadbent)
Status: Rejected
Priority: Normal
Assignee: 
Category: lib
Target version: 2.0.0


I would love to have a shorter alias for 'each_with_object', and would like to propose 'map_to'. Here are my arguments:

* It reads logically and clearly:

[1, 2, 3].map_to({}) {|i, hash| hash[i] = i ** 2 }
#=> {1 => 1, 2 => 4, 3 => 9}

* Rubyists are already using 'map' to build and return an array, so it should be obvious that 'map_to(object)' can be used to build and return an object.

* Given that 'each' and 'each_with_index' return the original array, I feel that the 'each_with_object' method name is slightly counterintuitive. 'map_to' might not be 100% semantically correct, but it's obvious that it will return something other than the original array.

* Many people (myself included) were using inject({}) {|hash, el| ... ; hash } instead of 'each_with_object', partly because of ignorance, but also because 'each_with_object' is so long. 'map_to' is the same length as inject, and means that you don't have to return the object at the end of the block.

* Only a single line of code is needed to implement the alias.


Best,
Nathan


-- 
http://bugs.ruby-lang.org/