<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: hash code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sun, 18 May 2008 14:38:37 GMT</pubDate>
    <description>DZone Snippets: hash code</description>
    <item>
      <title>Convert two Arrays into one Hash (Ruby)</title>
      <link>http://snippets.dzone.com/posts/show/4932</link>
      <description>This is a way to merge two arrays into one hash.&lt;br /&gt;The returned hash will have the same quantity of elements that the first(self) array. &lt;br /&gt;&lt;br /&gt;class Array&lt;br /&gt; def merge_into_hash(anArray)&lt;br /&gt;  tmp,hash = anArray.dup,{}&lt;br /&gt;  self.each {|key| hash[key] = tmp.shift}&lt;br /&gt;  hash&lt;br /&gt; end&lt;br /&gt;end</description>
      <pubDate>Fri, 28 Dec 2007 18:58:36 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4932</guid>
      <author>jmrepetti (Juan Matias)</author>
    </item>
    <item>
      <title>Hash#collate</title>
      <link>http://snippets.dzone.com/posts/show/4930</link>
      <description>&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;# From: http://www.ruby-forum.com/topic/135807&lt;br /&gt;# Author: Nobuyoshi Nakada&lt;br /&gt;&lt;br /&gt;class Hash&lt;br /&gt;   def collate(h)&lt;br /&gt;      raise ArgumentError unless h.is_a?(Hash)&lt;br /&gt;      update(h) { |key, *values| values }&lt;br /&gt;      #update(h) { |key, *values| values.flatten.uniq }&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;h1 = {:a=&gt;1, :b=&gt;2 }&lt;br /&gt;h2 = {:a=&gt;3, :b=&gt;4, :c=&gt;5}&lt;br /&gt;h1.collate(h2)&lt;br /&gt;p h1, h2     &lt;br /&gt;#=&gt; {:b=&gt;[2, 4], :a=&gt;[1, 3], :c=&gt;5}&lt;br /&gt;#=&gt; {:b=&gt;4, :a=&gt;3, :c=&gt;5}&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;h1 = {:a=&gt;1, :b=&gt;2 }&lt;br /&gt;h2 = {:a=&gt;3, :b=&gt;4, :c=&gt;5}&lt;br /&gt;h2.collate(h1)&lt;br /&gt;p h1, h2     &lt;br /&gt;#=&gt; {:b=&gt;2, :a=&gt;1}&lt;br /&gt;#=&gt; {:b=&gt;[4, 2], :a=&gt;[3, 1], :c=&gt;5}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;</description>
      <pubDate>Fri, 28 Dec 2007 11:50:03 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4930</guid>
      <author>ntk ()</author>
    </item>
    <item>
      <title>Ruby Hash Power-Set</title>
      <link>http://snippets.dzone.com/posts/show/4895</link>
      <description>// adds a #power_set method to Hash class&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# The Array power set is stolen from http://snippets.dzone.com/posts/show/3524&lt;br /&gt;class Array&lt;br /&gt;  # Returns the "power set" for this Array. This means that an array with all&lt;br /&gt;  # subsets of the array's elements will be returned.&lt;br /&gt;  def power_set&lt;br /&gt;    # the power set line is stolen from http://johncarrino.net/blog/2006/08/11/powerset-in-ruby/&lt;br /&gt;    inject([[]]){|c,y|r=[];c.each{|i|r&lt;&lt;i;r&lt;&lt;i+[y]};r}&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Hash&lt;br /&gt;  def power_set&lt;br /&gt;    # Returns the "power set" for this Hash. This means that a array with hashes of all&lt;br /&gt;    # subsets of the hash's (key =&gt; value) pairs will be returned.&lt;br /&gt;    # Example:&lt;br /&gt;    # &gt;&gt; {:feedback_type=&gt;"", :language_code=&gt;"", :comment=&gt;""}.power_set&lt;br /&gt;    #&lt;br /&gt;    # [{}, {:comment=&gt;""}, {:language_code=&gt;""}, {:language_code=&gt;"", :comment=&gt;""}, {:feedback_type=&gt;""}, {:feedback_type=&gt;"", :comment=&gt;""}, {:feedback_type=&gt;"", :language_code=&gt;""}, {:feedback_type=&gt;"", :language_code=&gt;"", :comment=&gt;""}]&lt;br /&gt;    &lt;br /&gt;    hash_to_array = self.to_a&lt;br /&gt;    array_power_set = hash_to_array.power_set&lt;br /&gt;    hash_power_set = array_power_set.collect { |pairs| pairs.inject({}) { |hash,pair| hash[pair[0]] = pair[1]; hash } }&lt;br /&gt;    hash_power_set&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 13 Dec 2007 12:14:16 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4895</guid>
      <author>helder (Helder Ribeiro)</author>
    </item>
    <item>
      <title>Hash#deep_delete</title>
      <link>http://snippets.dzone.com/posts/show/4725</link>
      <description>&lt;code&gt;&lt;br /&gt;&lt;br /&gt;class Object&lt;br /&gt;   def deep_clone&lt;br /&gt;      Marshal.load(Marshal.dump(self))&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Hash&lt;br /&gt;&lt;br /&gt;   # From: http://www.sameshirteveryday.com/2007/09/23/ruby-get-full-history-all-parents-of-a-hash-node&lt;br /&gt;   # Author: Alex Gorbatchev&lt;br /&gt;   # for further recursive hash methods see: &lt;br /&gt;   # - http://snippets.dzone.com/posts/show/1908&lt;br /&gt;   # - http://snippets.dzone.com/posts/show/4706&lt;br /&gt;   &lt;br /&gt;   def nested_key(desired_key, &amp;block)&lt;br /&gt;&lt;br /&gt;      return false unless Hash === self&lt;br /&gt;      #return false unless self.is_a?(Hash)&lt;br /&gt;&lt;br /&gt;      self.each_pair do |k,v|  &lt;br /&gt;         if k == desired_key or v.nested_key(desired_key, &amp;block)  &lt;br /&gt;            yield(k,v)  &lt;br /&gt;            return true  &lt;br /&gt;         end  &lt;br /&gt;      end  &lt;br /&gt;&lt;br /&gt;      return false  &lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def deep_values(key)   # cf. http://snippets.dzone.com/posts/show/1908 &lt;br /&gt;&lt;br /&gt;      hash = self.deep_clone&lt;br /&gt;      ret = []&lt;br /&gt;&lt;br /&gt;      begin&lt;br /&gt;&lt;br /&gt;         ar = []&lt;br /&gt;         result = hash.nested_key(key) { |k, v| ar &lt;&lt; k }&lt;br /&gt;         break unless result&lt;br /&gt;         ar = ar.reverse&lt;br /&gt;&lt;br /&gt;         hk = ""&lt;br /&gt;         ar.size.times { |i| hk &lt;&lt; "[ar[#{i}]]" }&lt;br /&gt;         #str = "hash" &lt;&lt; hk &lt;&lt; " rescue nil"&lt;br /&gt;         str = "hash" &lt;&lt; hk &lt;br /&gt;&lt;br /&gt;         # get value for hash key hk&lt;br /&gt;         ret &lt;&lt; eval(str)&lt;br /&gt;&lt;br /&gt;         # delete the hash key&lt;br /&gt;         key_to_delete = [ar.pop]&lt;br /&gt;&lt;br /&gt;         hk = ""&lt;br /&gt;         ar.size.times { |i| hk &lt;&lt; "[ar[#{i}]]" }&lt;br /&gt;         str = "hash" &lt;&lt; hk&lt;br /&gt;         str = str &lt;&lt; ".delete(key_to_delete.first)"&lt;br /&gt;         eval(str)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      end while result&lt;br /&gt;&lt;br /&gt;      hash.clear  # optional&lt;br /&gt;      ret&lt;br /&gt;&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def deep_delete(key)&lt;br /&gt;&lt;br /&gt;      hash = self&lt;br /&gt;&lt;br /&gt;      begin&lt;br /&gt;&lt;br /&gt;         ar = []&lt;br /&gt;         result = hash.nested_key(key) { |k, v| ar &lt;&lt; k }&lt;br /&gt;         break unless result&lt;br /&gt;         ar = ar.reverse&lt;br /&gt;&lt;br /&gt;         # delete the hash key&lt;br /&gt;         key_to_delete = [ar.pop]&lt;br /&gt;&lt;br /&gt;         hk = ""&lt;br /&gt;         ar.size.times { |i| hk &lt;&lt; "[ar[#{i}]]" }&lt;br /&gt;         str = "hash" &lt;&lt; hk&lt;br /&gt;         str = str &lt;&lt; ".delete(key_to_delete.first)"&lt;br /&gt;         eval(str)&lt;br /&gt;&lt;br /&gt;      end while result&lt;br /&gt;&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;hash = {  &lt;br /&gt;  :level_1 =&gt; {  &lt;br /&gt;    :level_2 =&gt; {  :search =&gt; 'test1',&lt;br /&gt;      :level_3 =&gt; {  &lt;br /&gt;        :search =&gt; 'test2', :level_4 =&gt; {:search =&gt; 'test3'}&lt;br /&gt;      }  &lt;br /&gt;    }  &lt;br /&gt;  }  &lt;br /&gt;}  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;require 'pp'&lt;br /&gt;&lt;br /&gt;p hash&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;pp hash&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;hash.nested_key(:search) { |k, v| puts "#{k}  ::  #{v.inspect}" }&lt;br /&gt;&lt;br /&gt;# prints out...&lt;br /&gt;# search  ::  "test1"&lt;br /&gt;# level_2  ::  {:search=&gt;"test1", :level_3=&gt;{:search=&gt;"test2", :level_4=&gt;{:search=&gt;"test3"}}}&lt;br /&gt;# level_1  ::  {:level_2=&gt;{:search=&gt;"test1", :level_3=&gt;{:search=&gt;"test2", :level_4=&gt;{:search=&gt;"test3"}}}}&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;puts "DEEP VALUES"&lt;br /&gt;p hash.deep_values(:search)   #=&gt; ["test1", "test2", "test3"]&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;puts "DEEP VALUES DELETED"&lt;br /&gt;hash.deep_delete(:search)&lt;br /&gt;p hash   #=&gt; {:level_1=&gt;{:level_2=&gt;{:level_3=&gt;{:level_4=&gt;{}}}}}&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;puts "DEEP VALUES"&lt;br /&gt;p hash.deep_values(:search)   #=&gt; []&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 01 Nov 2007 15:42:50 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4725</guid>
      <author>ntk ()</author>
    </item>
    <item>
      <title>Hash#deep_merge</title>
      <link>http://snippets.dzone.com/posts/show/4706</link>
      <description>&lt;code&gt;&lt;br /&gt;&lt;br /&gt;# Hash#deep_merge&lt;br /&gt;# From: http://pastie.textmate.org/pastes/30372, Elliott Hird&lt;br /&gt;# Source: http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html&lt;br /&gt;# This file contains extensions to Ruby and other useful snippits of code.&lt;br /&gt;# Time to extend Hash with some recursive merging magic.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Hash&lt;br /&gt;&lt;br /&gt;  # Merges self with another hash, recursively.&lt;br /&gt;  # &lt;br /&gt;  # This code was lovingly stolen from some random gem:&lt;br /&gt;  # http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html&lt;br /&gt;  # &lt;br /&gt;  # Thanks to whoever made it.&lt;br /&gt;&lt;br /&gt;  def deep_merge(hash)&lt;br /&gt;    target = dup&lt;br /&gt;    &lt;br /&gt;    hash.keys.each do |key|&lt;br /&gt;      if hash[key].is_a? Hash and self[key].is_a? Hash&lt;br /&gt;        target[key] = target[key].deep_merge(hash[key])&lt;br /&gt;        next&lt;br /&gt;      end&lt;br /&gt;      &lt;br /&gt;      target[key] = hash[key]&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    target&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  # From: http://www.gemtacular.com/gemdocs/cerberus-0.2.2/doc/classes/Hash.html&lt;br /&gt;  # File lib/cerberus/utils.rb, line 42&lt;br /&gt;&lt;br /&gt;  def deep_merge!(second)&lt;br /&gt;    second.each_pair do |k,v|&lt;br /&gt;      if self[k].is_a?(Hash) and second[k].is_a?(Hash)&lt;br /&gt;        self[k].deep_merge!(second[k])&lt;br /&gt;      else&lt;br /&gt;        self[k] = second[k]&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#-----------------&lt;br /&gt;        &lt;br /&gt;   # cf. http://subtech.g.hatena.ne.jp/cho45/20061122&lt;br /&gt;   def deep_merge2(other)&lt;br /&gt;      deep_proc = Proc.new { |k, s, o|&lt;br /&gt;         if s.kind_of?(Hash) &amp;&amp; o.kind_of?(Hash)&lt;br /&gt;            next s.merge(o, &amp;deep_proc)&lt;br /&gt;         end&lt;br /&gt;         next o&lt;br /&gt;      }&lt;br /&gt;      merge(other, &amp;deep_proc)&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def deep_merge3(second)&lt;br /&gt;&lt;br /&gt;      # From: http://www.ruby-forum.com/topic/142809&lt;br /&gt;      # Author: Stefan Rusterholz&lt;br /&gt;&lt;br /&gt;      merger = proc { |key,v1,v2| Hash === v1 &amp;&amp; Hash === v2 ? v1.merge(v2, &amp;merger) : v2 }&lt;br /&gt;      self.merge(second, &amp;merger)&lt;br /&gt;&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def keep_merge(hash)&lt;br /&gt;      target = dup&lt;br /&gt;      hash.keys.each do |key|&lt;br /&gt;         if hash[key].is_a? Hash and self[key].is_a? Hash&lt;br /&gt;            target[key] = target[key].keep_merge(hash[key])&lt;br /&gt;            next&lt;br /&gt;         end&lt;br /&gt;         #target[key] = hash[key]&lt;br /&gt;         target.update(hash) { |key, *values| values.flatten.uniq }&lt;br /&gt;      end&lt;br /&gt;      target&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;h = {:a =&gt; {:b =&gt; :c}}.merge({:a =&gt; {:l =&gt; :x}})&lt;br /&gt;p h  #=&gt; {:a=&gt;{:l=&gt;:x}}&lt;br /&gt;&lt;br /&gt;h = {:a =&gt; {:b =&gt; :c}}.deep_merge({:a =&gt; {:l =&gt; :x}})&lt;br /&gt;p h  #=&gt; {:a=&gt;{:b=&gt;:c, :l=&gt;:x}}&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;h1 = {:a =&gt; {:b =&gt; :c}}&lt;br /&gt;h2 = {:a =&gt; {:l =&gt; :x}}&lt;br /&gt;&lt;br /&gt;h = h1.deep_merge(h2)&lt;br /&gt;p h1, h2, h&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;h = h1.deep_merge2(h2)&lt;br /&gt;p h1, h2, h&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;h = h1.deep_merge!(h2)&lt;br /&gt;p h1, h2, h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;h1 = {:a =&gt; {:b =&gt; :c}}&lt;br /&gt;h2 = {:a =&gt; {:l =&gt; :x}}&lt;br /&gt;&lt;br /&gt;p h1.deep_merge3(h2)&lt;br /&gt;p h1, h2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;first = {&lt;br /&gt;  :data=&gt;{&lt;br /&gt;    :name=&gt;{&lt;br /&gt;      :first=&gt;'Sam',&lt;br /&gt;      :middle=&gt;'I',&lt;br /&gt;      :last=&gt;'am'&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;second={&lt;br /&gt;  :data=&gt;{&lt;br /&gt;    :name=&gt;{&lt;br /&gt;      :middle=&gt;'you',&lt;br /&gt;      :last=&gt;'are'&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;p first.deep_merge3(second)&lt;br /&gt;#=&gt; {:data=&gt;{:name=&gt;{:middle=&gt;"you", :first=&gt;"Sam", :last=&gt;"are"}}}&lt;br /&gt;&lt;br /&gt;p first.keep_merge(second)&lt;br /&gt;#=&gt;  {:data=&gt;{:name=&gt;{:first=&gt;"Sam", :middle=&gt;["I", "you"], :last=&gt;["am", "are"]}}}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 27 Oct 2007 18:07:40 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4706</guid>
      <author>ntk ()</author>
    </item>
    <item>
      <title>Usefull Additions to the Hash Class</title>
      <link>http://snippets.dzone.com/posts/show/4519</link>
      <description>Rename keys and return a duplicate hash, or perform the method and modify the current hash.&lt;br /&gt;Check each value in the hash and return true if they are all empty, otherwise return false.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class Hash&lt;br /&gt;  def rename_key(old_key, new_key)&lt;br /&gt;    return Hash.rename_key(self.dup, old_key, new_key)&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def rename_key!(old_key, new_key)&lt;br /&gt;    return Hash.rename_key(self, old_key, new_key)&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def all_values_empty?&lt;br /&gt;    self.each_value do |v|&lt;br /&gt;      return false if v and v != ""&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    return true&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  private&lt;br /&gt;    def self.rename_key(hsh, old_key, new_key)&lt;br /&gt;      hsh[new_key.to_s] = hsh.delete(old_key.to_s)&lt;br /&gt;      return hsh&lt;br /&gt;    end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 10 Sep 2007 21:01:10 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4519</guid>
      <author>akbloom (Andrew Bloom)</author>
    </item>
    <item>
      <title>to_hoa</title>
      <link>http://snippets.dzone.com/posts/show/4404</link>
      <description>&lt;code&gt;&lt;br /&gt;class Array&lt;br /&gt;  &lt;br /&gt;  # Make a hash of arrays out of an array&lt;br /&gt;  # of somethings by involving each element.&lt;br /&gt;  #&lt;br /&gt;  # Pass a block returning each keys' name.&lt;br /&gt;  #&lt;br /&gt;  # Example usage:&lt;br /&gt;  #&lt;br /&gt;  # &gt;&gt; [1, 2, 3].to_hoa { |n| (n+96).chr }&lt;br /&gt;  # =&gt; {"a"=&gt;[1], "b"=&gt;[2], "c"=&gt;[3]}&lt;br /&gt;  #&lt;br /&gt;  # &gt;&gt; ['a', 'a', 'a', 'b', 'b', 'c'].to_hoa {|x|x}&lt;br /&gt;  # =&gt; {"a"=&gt;["a", "a", "a"], "b"=&gt;["b", "b"], "c"=&gt;["c"]}&lt;br /&gt;    &lt;br /&gt;  def to_hoa&lt;br /&gt;    inject({}) { |h,v| (h[yield(v)] ||= []).push v; h }&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;update:&lt;/em&gt; RoR provides &lt;strong&gt;group_by&lt;/strong&gt;, which does exactly the same using Enumerable (thanks Matt for pointing this out).</description>
      <pubDate>Thu, 09 Aug 2007 16:36:20 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4404</guid>
      <author>413x ()</author>
    </item>
    <item>
      <title>Create nested hashes in Ruby</title>
      <link>http://snippets.dzone.com/posts/show/4146</link>
      <description>&lt;code&gt;&lt;br /&gt;&lt;br /&gt;# From: http://www.ruby-forum.com/topic/111524&lt;br /&gt;# Author: Daniel Martin&lt;br /&gt;&lt;br /&gt;a = Hash.new{|h,k| h[k]=Hash.new(&amp;h.default_proc) }&lt;br /&gt;&lt;br /&gt;a[2][1]=2&lt;br /&gt;a[2][2][3]=4&lt;br /&gt;a[3][1][1][1]=1&lt;br /&gt;&lt;br /&gt;p  a     #=&gt; {2=&gt;{1=&gt;2, 2=&gt;{3=&gt;4}}, 3=&gt;{1=&gt;{1=&gt;{1=&gt;1}}}}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# From: http://www.ruby-forum.com/topic/130324&lt;br /&gt;# Author: Bob Hutchison&lt;br /&gt;&lt;br /&gt;class Hash&lt;br /&gt;   def Hash.new_nested_hash&lt;br /&gt;     Hash.new{|h,k| h[k]=Hash.new(&amp;h.default_proc) }&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;a = Hash.new_nested_hash&lt;br /&gt;&lt;br /&gt;a[2][1]=2&lt;br /&gt;a[2][2][3]=4&lt;br /&gt;a[3][1][1][1]=1&lt;br /&gt;&lt;br /&gt;p  a     #=&gt; {2=&gt;{1=&gt;2, 2=&gt;{3=&gt;4}}, 3=&gt;{1=&gt;{1=&gt;{1=&gt;1}}}}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# From: http://www.rubyquiz.com/quiz113.html&lt;br /&gt;# Author: Carl Porth&lt;br /&gt;&lt;br /&gt;ar = ('a'..'g').to_a&lt;br /&gt;p  ar.reverse.inject { |mem, var| {var =&gt; mem} }    #=&gt; {"a"=&gt;{"b"=&gt;{"c"=&gt;{"d"=&gt;{"e"=&gt;{"f"=&gt;"g"}}}}}}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 15 Jun 2007 13:08:34 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4146</guid>
      <author>ntk ()</author>
    </item>
    <item>
      <title>Random key from Ruby Hash (even faster)</title>
      <link>http://snippets.dzone.com/posts/show/3942</link>
      <description>I came across &lt;a href="/posts/show/54"&gt;baby's code&lt;/a&gt; and then &lt;a href="/posts/show/251"&gt;aiosup's&lt;/a&gt; from 2 years ago, and realized that I like the simplicity of one and the approach of the other. Kudos to both authors, and I found a way to combine the two approaches into one neat mechanism. &lt;a href="http://pqmf.com"&gt;More of my ruby here,&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class Hash&lt;br /&gt;  @keys_not_used = nil&lt;br /&gt;&lt;br /&gt;  def random_key&lt;br /&gt;          @keys_not_used = self.dup if (!@keys_not_used or @keys_not_used.size == 0)&lt;br /&gt;	  key = @keys_not_used.keys[rand(@keys_not_used.size)]&lt;br /&gt;	  @keys_not_used.delete(key)&lt;br /&gt;          key&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 02 May 2007 03:00:58 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3942</guid>
      <author>blackrat (Paul McKibbin)</author>
    </item>
    <item>
      <title>Turn CSV with headers into Array of Hashes (in 5 lines or less)</title>
      <link>http://snippets.dzone.com/posts/show/3899</link>
      <description>This assumes you have a CSV file whose first line are headings/labels for the individual columns.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'csv'&lt;br /&gt;&lt;br /&gt;csv_data = CSV.read 'data.csv'&lt;br /&gt;headers = csv_data.shift.map {|i| i.to_s }&lt;br /&gt;string_data = csv_data.map {|row| row.map {|cell| cell.to_s } }&lt;br /&gt;array_of_hashes = string_data.map {|row| Hash[*headers.zip(row).flatten] }&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 25 Apr 2007 15:10:12 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3899</guid>
      <author>seancribbs (Sean Cribbs)</author>
    </item>
  </channel>
</rss>
