From: yutakaha.ra@... Date: 2014-09-11T16:19:37+00:00 Subject: [ruby-core:64967] [ruby-trunk - Feature #10208] Passing block to Enumerable#to_h Issue #10208 has been updated by Yutaka HARA. Marc-Andre Lafortune wrote: > I completely agree that we need new methods to do this. Thanks. One idea is name it Enumerable#hash_by (like max_by, group_by) ~~~ User = Struct.new(:id, :name) users = [User.new(1, "Alice"), User.new(2, "Bob")] users.hash_by{|u| [u.id, u.name]} # {1 => "Alice", 2 => "Bob"} ~~~ ---------------------------------------- Feature #10208: Passing block to Enumerable#to_h https://bugs.ruby-lang.org/issues/10208#change-48849 * Author: Yutaka HARA * Status: Open * Priority: Normal * Assignee: * Category: core * Target version: current: 2.2.0 ---------------------------------------- Now that we can convert 'a list of [key, value] pairs' into a hash with Enumerable#to_h, how about make it take a block to specify 'how to convert each element into a [key, value] pair'? Example: ~~~ # Convert users into an {id => name} hash users.map{|u| [u.id, u.name]}.to_h ��� # Convert users into an {id => name} hash users.to_h{|u| [u.id, u.name]} ~~~ This could also be a solution for these feature requests: * Feature #6669 A method like Hash#map but returns hash hsh.apply{|k, v| [k.to_s, v]} == hsh.to_h{|k, v| [k.to_s, v]} * Feature #7793 New methods on Hash Feature #9970 Add `Hash#map_keys` and `Hash#map_values` hsh.map_k(&:to_s) == hsh.to_h{|k, v| [k.to_s, v]} hsh.map_v(&:to_i) == hsh.to_h{|k, v| [k, v.to_i]} hsh.map_kv(&block) == hsh.to_h(&block) -- https://bugs.ruby-lang.org/