From: pyarnau@... Date: 2014-02-13T10:38:22+00:00 Subject: [ruby-core:60683] [ruby-trunk - Feature #666] Enumerable::to_hash Issue #666 has been updated by Arnau Sanchez. For those interested in this feature, check #7292, Marc-Andre implemented Array#to_h and Enumerable#to_h. It's not as powerful (since it takes no block, you'll usually need an intermediate array with "map"), but it's definitely better than Hash[pairs]. Thanks Marc-Andre. ---------------------------------------- Feature #666: Enumerable::to_hash https://bugs.ruby-lang.org/issues/666#change-45108 * Author: Marc-Andre Lafortune * Status: Rejected * Priority: Low * Assignee: Yukihiro Matsumoto * Category: * Target version: 2.0.0 ---------------------------------------- =begin There are many ways to obtain an array from enumerables (to_a, map, ...). There is no natural way to obtain a hash from an enumerable (except for Hash[some_array]). There is a Hash::to_a but no Array::to_hash. Here is what I would like: [[:hello, "world"], [:choice, [:red_pill, :blue_pill]]].to_hash ==> {:hello=>"world", :choice=>[:red_pill, :blue_pill]} (1..3).to_hash{|n| [n, n**2]} ==> {1 => 1, 2 ==> 4, 3 ==> 9} I propose to add the following Enumerable::to_hash : module Enumerable def to_hash result = {} self.each do |key, value| key, value = yield(key, value) if block_given? result[key] = value end result end end Since Hash::to_a returns an array of key-value pairs, I fell it's natural that a block to construct a Hash should return key-value pairs. This definition has nice symmetric properties: for any Hash h, the following all return a copy of h. h.to_a.to_hash h.to_hash{|p| p} h.to_hash{|k,v| [k,v]} h.keys.zip(h.values).to_hash Thank you for your attention, Marc-Andre Lafortune =end -- http://bugs.ruby-lang.org/