HEX
Server: Apache
System: Windows NT MAGNETO-ARM 10.0 build 22000 (Windows 10) AMD64
User: Michel (0)
PHP: 7.4.7
Disabled: NONE
Upload Files
File: C:/Ruby27-x64/share/doc/ruby/html/Hash.html
<!DOCTYPE html>

<html>
<head>
<meta charset="UTF-8">

<title>class Hash - RDoc Documentation</title>

<script type="text/javascript">
  var rdoc_rel_prefix = "./";
  var index_rel_prefix = "./";
</script>

<script src="./js/navigation.js" defer></script>
<script src="./js/search.js" defer></script>
<script src="./js/search_index.js" defer></script>
<script src="./js/searcher.js" defer></script>
<script src="./js/darkfish.js" defer></script>

<link href="./css/fonts.css" rel="stylesheet">
<link href="./css/rdoc.css" rel="stylesheet">




<body id="top" role="document" class="class">
<nav role="navigation">
  <div id="project-navigation">
    <div id="home-section" role="region" title="Quick navigation" class="nav-section">
  <h2>
    <a href="./index.html" rel="home">Home</a>
  </h2>

  <div id="table-of-contents-navigation">
    <a href="./table_of_contents.html#pages">Pages</a>
    <a href="./table_of_contents.html#classes">Classes</a>
    <a href="./table_of_contents.html#methods">Methods</a>
  </div>
</div>

    <div id="search-section" role="search" class="project-section initially-hidden">
  <form action="#" method="get" accept-charset="utf-8">
    <div id="search-field-wrapper">
      <input id="search-field" role="combobox" aria-label="Search"
             aria-autocomplete="list" aria-controls="search-results"
             type="text" name="search" placeholder="Search" spellcheck="false"
             title="Type to search, Up and Down to navigate, Enter to load">
    </div>

    <ul id="search-results" aria-label="Search Results"
        aria-busy="false" aria-expanded="false"
        aria-atomic="false" class="initially-hidden"></ul>
  </form>
</div>

  </div>

  
<div class="nav-section">
  <h3>Table of Contents</h3>

  <ul class="link-list" role="directory">
    <li><a href="#class-Hash-label-Common+Uses">Common Uses</a>
    <li><a href="#class-Hash-label-Hash+Keys">Hash Keys</a>
  </ul>
</div>


  <div id="class-metadata">
    
    <div id="parent-class-section" class="nav-section">
  <h3>Parent</h3>

  
  <p class="link"><a href="Object.html">Object</a>
  
</div>

    <div id="includes-section" class="nav-section">
  <h3>Included Modules</h3>

  <ul class="link-list">
  
  
    <li><a class="include" href="Enumerable.html">Enumerable</a>
  
  
  </ul>
</div>

    
    <!-- Method Quickref -->
<div id="method-list-section" class="nav-section">
  <h3>Methods</h3>

  <ul class="link-list" role="directory">
    
    <li ><a href="#method-c-5B-5D">::[]</a>
    
    <li ><a href="#method-c-new">::new</a>
    
    <li ><a href="#method-c-ruby2_keywords_hash">::ruby2_keywords_hash</a>
    
    <li ><a href="#method-c-ruby2_keywords_hash-3F">::ruby2_keywords_hash?</a>
    
    <li ><a href="#method-c-try_convert">::try_convert</a>
    
    <li ><a href="#method-i-3C">#&lt;</a>
    
    <li ><a href="#method-i-3C-3D">#&lt;=</a>
    
    <li ><a href="#method-i-3D-3D">#==</a>
    
    <li ><a href="#method-i-3E">#&gt;</a>
    
    <li ><a href="#method-i-3E-3D">#&gt;=</a>
    
    <li ><a href="#method-i-5B-5D">#[]</a>
    
    <li ><a href="#method-i-5B-5D-3D">#[]=</a>
    
    <li ><a href="#method-i-any-3F">#any?</a>
    
    <li ><a href="#method-i-assoc">#assoc</a>
    
    <li ><a href="#method-i-clear">#clear</a>
    
    <li ><a href="#method-i-compact">#compact</a>
    
    <li ><a href="#method-i-compact-21">#compact!</a>
    
    <li ><a href="#method-i-compare_by_identity">#compare_by_identity</a>
    
    <li ><a href="#method-i-compare_by_identity-3F">#compare_by_identity?</a>
    
    <li ><a href="#method-i-deconstruct_keys">#deconstruct_keys</a>
    
    <li ><a href="#method-i-default">#default</a>
    
    <li ><a href="#method-i-default-3D">#default=</a>
    
    <li ><a href="#method-i-default_proc">#default_proc</a>
    
    <li ><a href="#method-i-default_proc-3D">#default_proc=</a>
    
    <li ><a href="#method-i-delete">#delete</a>
    
    <li ><a href="#method-i-delete_if">#delete_if</a>
    
    <li ><a href="#method-i-dig">#dig</a>
    
    <li ><a href="#method-i-each">#each</a>
    
    <li ><a href="#method-i-each_key">#each_key</a>
    
    <li ><a href="#method-i-each_pair">#each_pair</a>
    
    <li ><a href="#method-i-each_value">#each_value</a>
    
    <li ><a href="#method-i-empty-3F">#empty?</a>
    
    <li ><a href="#method-i-eql-3F">#eql?</a>
    
    <li ><a href="#method-i-fetch">#fetch</a>
    
    <li ><a href="#method-i-fetch_values">#fetch_values</a>
    
    <li ><a href="#method-i-filter">#filter</a>
    
    <li ><a href="#method-i-filter-21">#filter!</a>
    
    <li ><a href="#method-i-flatten">#flatten</a>
    
    <li ><a href="#method-i-has_key-3F">#has_key?</a>
    
    <li ><a href="#method-i-has_value-3F">#has_value?</a>
    
    <li ><a href="#method-i-hash">#hash</a>
    
    <li ><a href="#method-i-include-3F">#include?</a>
    
    <li ><a href="#method-i-initialize_copy">#initialize_copy</a>
    
    <li ><a href="#method-i-inspect">#inspect</a>
    
    <li ><a href="#method-i-invert">#invert</a>
    
    <li ><a href="#method-i-keep_if">#keep_if</a>
    
    <li ><a href="#method-i-key">#key</a>
    
    <li ><a href="#method-i-key-3F">#key?</a>
    
    <li ><a href="#method-i-keys">#keys</a>
    
    <li ><a href="#method-i-length">#length</a>
    
    <li ><a href="#method-i-member-3F">#member?</a>
    
    <li ><a href="#method-i-merge">#merge</a>
    
    <li ><a href="#method-i-merge-21">#merge!</a>
    
    <li ><a href="#method-i-rassoc">#rassoc</a>
    
    <li ><a href="#method-i-rehash">#rehash</a>
    
    <li ><a href="#method-i-reject">#reject</a>
    
    <li ><a href="#method-i-reject-21">#reject!</a>
    
    <li ><a href="#method-i-replace">#replace</a>
    
    <li ><a href="#method-i-select">#select</a>
    
    <li ><a href="#method-i-select-21">#select!</a>
    
    <li ><a href="#method-i-shift">#shift</a>
    
    <li ><a href="#method-i-size">#size</a>
    
    <li ><a href="#method-i-slice">#slice</a>
    
    <li ><a href="#method-i-store">#store</a>
    
    <li ><a href="#method-i-to_a">#to_a</a>
    
    <li ><a href="#method-i-to_h">#to_h</a>
    
    <li ><a href="#method-i-to_hash">#to_hash</a>
    
    <li ><a href="#method-i-to_proc">#to_proc</a>
    
    <li ><a href="#method-i-to_s">#to_s</a>
    
    <li ><a href="#method-i-transform_keys">#transform_keys</a>
    
    <li ><a href="#method-i-transform_keys-21">#transform_keys!</a>
    
    <li ><a href="#method-i-transform_values">#transform_values</a>
    
    <li ><a href="#method-i-transform_values-21">#transform_values!</a>
    
    <li ><a href="#method-i-update">#update</a>
    
    <li ><a href="#method-i-value-3F">#value?</a>
    
    <li ><a href="#method-i-values">#values</a>
    
    <li ><a href="#method-i-values_at">#values_at</a>
    
  </ul>
</div>

  </div>
</nav>

<main role="main" aria-labelledby="class-Hash">
  <h1 id="class-Hash" class="class">
    class Hash
  </h1>

  <section class="description">
    
<p>A <a href="Hash.html"><code>Hash</code></a> is a dictionary-like collection of unique keys and their values. Also called associative arrays, they are similar to Arrays, but where an <a href="Array.html"><code>Array</code></a> uses integers as its index, a <a href="Hash.html"><code>Hash</code></a> allows you to use any object type.</p>

<p>Hashes enumerate their values in the order that the corresponding keys were inserted.</p>

<p>A <a href="Hash.html"><code>Hash</code></a> can be easily created by using its implicit form:</p>

<pre class="ruby"><span class="ruby-identifier">grades</span> = { <span class="ruby-string">&quot;Jane Doe&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">10</span>, <span class="ruby-string">&quot;Jim Doe&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">6</span> }
</pre>

<p>Hashes allow an alternate syntax for keys that are symbols. Instead of</p>

<pre class="ruby"><span class="ruby-identifier">options</span> = { <span class="ruby-value">:font_size</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">10</span>, <span class="ruby-value">:font_family</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;Arial&quot;</span> }
</pre>

<p>You could write it as:</p>

<pre class="ruby"><span class="ruby-identifier">options</span> = { <span class="ruby-value">font_size:</span> <span class="ruby-value">10</span>, <span class="ruby-value">font_family:</span> <span class="ruby-string">&quot;Arial&quot;</span> }
</pre>

<p>Each named key is a symbol you can access in hash:</p>

<pre class="ruby"><span class="ruby-identifier">options</span>[<span class="ruby-value">:font_size</span>]  <span class="ruby-comment"># =&gt; 10</span>
</pre>

<p>A <a href="Hash.html"><code>Hash</code></a> can also be created through its <a href="Hash.html#method-c-new"><code>::new</code></a> method:</p>

<pre class="ruby"><span class="ruby-identifier">grades</span> = <span class="ruby-constant">Hash</span>.<span class="ruby-identifier">new</span>
<span class="ruby-identifier">grades</span>[<span class="ruby-string">&quot;Dorothy Doe&quot;</span>] = <span class="ruby-value">9</span>
</pre>

<p>Hashes have a <em>default value</em> that is returned when accessing keys that do not exist in the hash. If no default is set <code>nil</code> is used. You can set the default value by sending it as an argument to <a href="Hash.html#method-c-new"><code>Hash.new</code></a>:</p>

<pre class="ruby"><span class="ruby-identifier">grades</span> = <span class="ruby-constant">Hash</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">0</span>)
</pre>

<p>Or by using the <a href="Hash.html#method-i-default-3D"><code>default=</code></a> method:</p>

<pre class="ruby"><span class="ruby-identifier">grades</span> = {<span class="ruby-string">&quot;Timmy Doe&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">8</span>}
<span class="ruby-identifier">grades</span>.<span class="ruby-identifier">default</span> = <span class="ruby-value">0</span>
</pre>

<p>Accessing a value in a <a href="Hash.html"><code>Hash</code></a> requires using its key:</p>

<pre class="ruby"><span class="ruby-identifier">puts</span> <span class="ruby-identifier">grades</span>[<span class="ruby-string">&quot;Jane Doe&quot;</span>] <span class="ruby-comment"># =&gt; 0</span>
</pre>

<h3 id="class-Hash-label-Common+Uses">Common Uses<span><a href="#class-Hash-label-Common+Uses">&para;</a> <a href="#top">&uarr;</a></span></h3>

<p>Hashes are an easy way to represent data structures, such as</p>

<pre class="ruby"><span class="ruby-identifier">books</span>         = {}
<span class="ruby-identifier">books</span>[<span class="ruby-value">:matz</span>]  = <span class="ruby-string">&quot;The Ruby Programming Language&quot;</span>
<span class="ruby-identifier">books</span>[<span class="ruby-value">:black</span>] = <span class="ruby-string">&quot;The Well-Grounded Rubyist&quot;</span>
</pre>

<p>Hashes are also commonly used as a way to have named parameters in functions. Note that no brackets are used below. If a hash is the last argument on a method call, no braces are needed, thus creating a really clean interface:</p>

<pre class="ruby"><span class="ruby-constant">Person</span>.<span class="ruby-identifier">create</span>(<span class="ruby-value">name:</span> <span class="ruby-string">&quot;John Doe&quot;</span>, <span class="ruby-value">age:</span> <span class="ruby-value">27</span>)

<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier ruby-title">create</span>(<span class="ruby-identifier">params</span>)
  <span class="ruby-ivar">@name</span> = <span class="ruby-identifier">params</span>[<span class="ruby-value">:name</span>]
  <span class="ruby-ivar">@age</span>  = <span class="ruby-identifier">params</span>[<span class="ruby-value">:age</span>]
<span class="ruby-keyword">end</span>
</pre>

<h3 id="class-Hash-label-Hash+Keys"><a href="Hash.html"><code>Hash</code></a> Keys<span><a href="#class-Hash-label-Hash+Keys">&para;</a> <a href="#top">&uarr;</a></span></h3>

<p>Two objects refer to the same hash key when their <code>hash</code> value is identical and the two objects are <code>eql?</code> to each other.</p>

<p>A user-defined class may be used as a hash key if the <code>hash</code> and <code>eql?</code> methods are overridden to provide meaningful behavior.  By default, separate instances refer to separate hash keys.</p>

<p>A typical implementation of <code>hash</code> is based on the object&#39;s data while <code>eql?</code> is usually aliased to the overridden <code>==</code> method:</p>

<pre class="ruby"><span class="ruby-keyword">class</span> <span class="ruby-constant">Book</span>
  <span class="ruby-identifier">attr_reader</span> <span class="ruby-value">:author</span>, <span class="ruby-value">:title</span>

  <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">initialize</span>(<span class="ruby-identifier">author</span>, <span class="ruby-identifier">title</span>)
    <span class="ruby-ivar">@author</span> = <span class="ruby-identifier">author</span>
    <span class="ruby-ivar">@title</span> = <span class="ruby-identifier">title</span>
  <span class="ruby-keyword">end</span>

  <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">==</span>(<span class="ruby-identifier">other</span>)
    <span class="ruby-keyword">self</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">===</span> <span class="ruby-identifier">other</span> <span class="ruby-keyword">and</span>
      <span class="ruby-identifier">other</span>.<span class="ruby-identifier">author</span> <span class="ruby-operator">==</span> <span class="ruby-ivar">@author</span> <span class="ruby-keyword">and</span>
      <span class="ruby-identifier">other</span>.<span class="ruby-identifier">title</span> <span class="ruby-operator">==</span> <span class="ruby-ivar">@title</span>
  <span class="ruby-keyword">end</span>

  <span class="ruby-keyword">alias</span> <span class="ruby-identifier">eql?</span> <span class="ruby-identifier">==</span>

  <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">hash</span>
    <span class="ruby-ivar">@author</span>.<span class="ruby-identifier">hash</span> <span class="ruby-operator">^</span> <span class="ruby-ivar">@title</span>.<span class="ruby-identifier">hash</span> <span class="ruby-comment"># XOR</span>
  <span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>

<span class="ruby-identifier">book1</span> = <span class="ruby-constant">Book</span>.<span class="ruby-identifier">new</span> <span class="ruby-string">&#39;matz&#39;</span>, <span class="ruby-string">&#39;Ruby in a Nutshell&#39;</span>
<span class="ruby-identifier">book2</span> = <span class="ruby-constant">Book</span>.<span class="ruby-identifier">new</span> <span class="ruby-string">&#39;matz&#39;</span>, <span class="ruby-string">&#39;Ruby in a Nutshell&#39;</span>

<span class="ruby-identifier">reviews</span> = {}

<span class="ruby-identifier">reviews</span>[<span class="ruby-identifier">book1</span>] = <span class="ruby-string">&#39;Great reference!&#39;</span>
<span class="ruby-identifier">reviews</span>[<span class="ruby-identifier">book2</span>] = <span class="ruby-string">&#39;Nice and compact!&#39;</span>

<span class="ruby-identifier">reviews</span>.<span class="ruby-identifier">length</span> <span class="ruby-comment">#=&gt; 1</span>
</pre>

<p>See also <a href="Object.html#method-i-hash"><code>Object#hash</code></a> and <a href="Object.html#method-i-eql-3F"><code>Object#eql?</code></a></p>

  </section>

  
  <section id="5Buntitled-5D" class="documentation-section">
    

    

    

    

    
     <section id="public-class-5Buntitled-5D-method-details" class="method-section">
       <header>
         <h3>Public Class Methods</h3>
       </header>

    
      <div id="method-c-5B-5D" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            Hash[ key, value, ... ]         &rarr; new_hash
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            Hash[ [ [key, value], ... ] ]   &rarr; new_hash
          </span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            Hash[ object ]                  &rarr; new_hash
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Creates a new hash populated with the given objects.</p>

<p>Similar to the literal <code>{ <em>key</em> =&gt; <em>value</em>, ... }</code>. In the first form, keys and values occur in pairs, so there must be an even number of arguments.</p>

<p>The second and third form take a single argument which is either an array of key-value pairs or an object convertible to a hash.</p>

<pre class="ruby"><span class="ruby-constant">Hash</span>[<span class="ruby-string">&quot;a&quot;</span>, <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span>, <span class="ruby-value">200</span>]             <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200}</span>
<span class="ruby-constant">Hash</span>[ [ [<span class="ruby-string">&quot;a&quot;</span>, <span class="ruby-value">100</span>], [<span class="ruby-string">&quot;b&quot;</span>, <span class="ruby-value">200</span>] ] ]   <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200}</span>
<span class="ruby-constant">Hash</span>[<span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span>]         <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200}</span>
</pre>
          
          

          
          <div class="method-source-code" id="5B-5D-source">
            <pre>static VALUE
rb_hash_s_create(int argc, VALUE *argv, VALUE klass)
{
    VALUE hash, tmp;

    if (argc == 1) {
        tmp = rb_hash_s_try_convert(Qnil, argv[0]);
        if (!NIL_P(tmp)) {
            hash = hash_alloc(klass);
            if (RHASH_AR_TABLE_P(tmp)) {
                ar_copy(hash, tmp);
            }
            else {
                RHASH_ST_TABLE_SET(hash, st_copy(RHASH_ST_TABLE(tmp)));
            }
            return hash;
        }

        tmp = rb_check_array_type(argv[0]);
        if (!NIL_P(tmp)) {
            long i;

            hash = hash_alloc(klass);
            for (i = 0; i &lt; RARRAY_LEN(tmp); ++i) {
                VALUE e = RARRAY_AREF(tmp, i);
                VALUE v = rb_check_array_type(e);
                VALUE key, val = Qnil;

                if (NIL_P(v)) {
                    rb_raise(rb_eArgError, &quot;wrong element type %s at %ld (expected array)&quot;,
                             rb_builtin_class_name(e), i);
                }
                switch (RARRAY_LEN(v)) {
                  default:
                    rb_raise(rb_eArgError, &quot;invalid number of elements (%ld for 1..2)&quot;,
                             RARRAY_LEN(v));
                  case 2:
                    val = RARRAY_AREF(v, 1);
                  case 1:
                    key = RARRAY_AREF(v, 0);
                    rb_hash_aset(hash, key, val);
                }
            }
            return hash;
        }
    }
    if (argc % 2 != 0) {
        rb_raise(rb_eArgError, &quot;odd number of arguments for Hash&quot;);
    }

    hash = hash_alloc(klass);
    rb_hash_bulk_insert(argc, argv, hash);
    hash_verify(hash);
    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-c-new" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            new                          &rarr; new_hash
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            new(obj)                     &rarr; new_hash
          </span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            new {|hash, key| block }     &rarr; new_hash
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns a new, empty hash. If this hash is subsequently accessed by a key that doesn&#39;t correspond to a hash entry, the value returned depends on the style of <code>new</code> used to create the hash. In the first form, the access returns <code>nil</code>. If <em>obj</em> is specified, this single object will be used for all <em>default values</em>. If a block is specified, it will be called with the hash object and the key, and should return the default value. It is the block&#39;s responsibility to store the value in the hash if required.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = <span class="ruby-constant">Hash</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">&quot;Go Fish&quot;</span>)
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;a&quot;</span>] = <span class="ruby-value">100</span>
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;b&quot;</span>] = <span class="ruby-value">200</span>
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;a&quot;</span>]           <span class="ruby-comment">#=&gt; 100</span>
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;c&quot;</span>]           <span class="ruby-comment">#=&gt; &quot;Go Fish&quot;</span>
<span class="ruby-comment"># The following alters the single default object</span>
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;c&quot;</span>].<span class="ruby-identifier">upcase!</span>   <span class="ruby-comment">#=&gt; &quot;GO FISH&quot;</span>
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;d&quot;</span>]           <span class="ruby-comment">#=&gt; &quot;GO FISH&quot;</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">keys</span>           <span class="ruby-comment">#=&gt; [&quot;a&quot;, &quot;b&quot;]</span>

<span class="ruby-comment"># While this creates a new default object each time</span>
<span class="ruby-identifier">h</span> = <span class="ruby-constant">Hash</span>.<span class="ruby-identifier">new</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">hash</span>, <span class="ruby-identifier">key</span><span class="ruby-operator">|</span> <span class="ruby-identifier">hash</span>[<span class="ruby-identifier">key</span>] = <span class="ruby-node">&quot;Go Fish: #{key}&quot;</span> }
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;c&quot;</span>]           <span class="ruby-comment">#=&gt; &quot;Go Fish: c&quot;</span>
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;c&quot;</span>].<span class="ruby-identifier">upcase!</span>   <span class="ruby-comment">#=&gt; &quot;GO FISH: C&quot;</span>
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;d&quot;</span>]           <span class="ruby-comment">#=&gt; &quot;Go Fish: d&quot;</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">keys</span>           <span class="ruby-comment">#=&gt; [&quot;c&quot;, &quot;d&quot;]</span>
</pre>
          
          

          
          <div class="method-source-code" id="new-source">
            <pre>static VALUE
rb_hash_initialize(int argc, VALUE *argv, VALUE hash)
{
    VALUE ifnone;

    rb_hash_modify(hash);
    if (rb_block_given_p()) {
        rb_check_arity(argc, 0, 0);
        ifnone = rb_block_proc();
        SET_PROC_DEFAULT(hash, ifnone);
    }
    else {
        rb_check_arity(argc, 0, 1);
        ifnone = argc == 0 ? Qnil : argv[0];
        RHASH_SET_IFNONE(hash, ifnone);
    }

    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-c-ruby2_keywords_hash" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            ruby2_keywords_hash(hash) &rarr; hash
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Duplicates a given hash and adds a ruby2_keywords flag. This method is not for casual use; debugging, researching, and some truly necessary cases like deserialization of arguments.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = {<span class="ruby-value">k:</span> <span class="ruby-value">1</span>}
<span class="ruby-identifier">h</span> = <span class="ruby-constant">Hash</span>.<span class="ruby-identifier">ruby2_keywords_hash</span>(<span class="ruby-identifier">h</span>)
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">foo</span>(<span class="ruby-value">k:</span> <span class="ruby-value">42</span>)
  <span class="ruby-identifier">k</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">foo</span>(<span class="ruby-operator">*</span>[<span class="ruby-identifier">h</span>]) <span class="ruby-comment">#=&gt; 1 with neither a warning or an error</span>
</pre>
          
          

          
          <div class="method-source-code" id="ruby2_keywords_hash-source">
            <pre>static VALUE
rb_hash_s_ruby2_keywords_hash(VALUE dummy, VALUE hash)
{
    Check_Type(hash, T_HASH);
    hash = rb_hash_dup(hash);
    RHASH(hash)-&gt;basic.flags |= RHASH_PASS_AS_KEYWORDS;
    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-c-ruby2_keywords_hash-3F" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            ruby2_keywords_hash?(hash) &rarr; true or false
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Checks if a given hash is flagged by <a href="Module.html#method-i-ruby2_keywords"><code>Module#ruby2_keywords</code></a> (or <a href="Proc.html#method-i-ruby2_keywords"><code>Proc#ruby2_keywords</code></a>). This method is not for casual use; debugging, researching, and some truly necessary cases like serialization of arguments.</p>

<pre class="ruby"><span class="ruby-identifier">ruby2_keywords</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">foo</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">args</span>)
  <span class="ruby-constant">Hash</span>.<span class="ruby-identifier">ruby2_keywords_hash?</span>(<span class="ruby-identifier">args</span>.<span class="ruby-identifier">last</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">foo</span>(<span class="ruby-value">k:</span> <span class="ruby-value">1</span>)   <span class="ruby-comment">#=&gt; true</span>
<span class="ruby-identifier">foo</span>({<span class="ruby-value">k:</span> <span class="ruby-value">1</span>}) <span class="ruby-comment">#=&gt; false</span>
</pre>
          
          

          
          <div class="method-source-code" id="ruby2_keywords_hash-3F-source">
            <pre>static VALUE
rb_hash_s_ruby2_keywords_hash_p(VALUE dummy, VALUE hash)
{
    Check_Type(hash, T_HASH);
    return (RHASH(hash)-&gt;basic.flags &amp; RHASH_PASS_AS_KEYWORDS) ? Qtrue : Qfalse;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-c-try_convert" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            try_convert(obj) &rarr; hash or nil
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Try to convert <em>obj</em> into a hash, using <a href="Hash.html#method-i-to_hash"><code>to_hash</code></a> method. Returns converted hash or nil if <em>obj</em> cannot be converted for any reason.</p>

<pre class="ruby"><span class="ruby-constant">Hash</span>.<span class="ruby-identifier">try_convert</span>({<span class="ruby-value">1</span><span class="ruby-operator">=&gt;</span><span class="ruby-value">2</span>})   <span class="ruby-comment"># =&gt; {1=&gt;2}</span>
<span class="ruby-constant">Hash</span>.<span class="ruby-identifier">try_convert</span>(<span class="ruby-string">&quot;1=&gt;2&quot;</span>)   <span class="ruby-comment"># =&gt; nil</span>
</pre>
          
          

          
          <div class="method-source-code" id="try_convert-source">
            <pre>static VALUE
rb_hash_s_try_convert(VALUE dummy, VALUE hash)
{
    return rb_check_hash_type(hash);
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
    </section>
  
     <section id="public-instance-5Buntitled-5D-method-details" class="method-section">
       <header>
         <h3>Public Instance Methods</h3>
       </header>

    
      <div id="method-i-3C" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            hash &lt; other &rarr; true or false
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns <code>true</code> if <em>hash</em> is subset of <em>other</em>.</p>

<pre class="ruby"><span class="ruby-identifier">h1</span> = {<span class="ruby-value">a:</span><span class="ruby-value">1</span>, <span class="ruby-value">b:</span><span class="ruby-value">2</span>}
<span class="ruby-identifier">h2</span> = {<span class="ruby-value">a:</span><span class="ruby-value">1</span>, <span class="ruby-value">b:</span><span class="ruby-value">2</span>, <span class="ruby-value">c:</span><span class="ruby-value">3</span>}
<span class="ruby-identifier">h1</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">h2</span>    <span class="ruby-comment">#=&gt; true</span>
<span class="ruby-identifier">h2</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">h1</span>    <span class="ruby-comment">#=&gt; false</span>
<span class="ruby-identifier">h1</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">h1</span>    <span class="ruby-comment">#=&gt; false</span>
</pre>
          
          

          
          <div class="method-source-code" id="3C-source">
            <pre>static VALUE
rb_hash_lt(VALUE hash, VALUE other)
{
    other = to_hash(other);
    if (RHASH_SIZE(hash) &gt;= RHASH_SIZE(other)) return Qfalse;
    return hash_le(hash, other);
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-3C-3D" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            hash &lt;= other &rarr; true or false
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns <code>true</code> if <em>hash</em> is subset of <em>other</em> or equals to <em>other</em>.</p>

<pre class="ruby"><span class="ruby-identifier">h1</span> = {<span class="ruby-value">a:</span><span class="ruby-value">1</span>, <span class="ruby-value">b:</span><span class="ruby-value">2</span>}
<span class="ruby-identifier">h2</span> = {<span class="ruby-value">a:</span><span class="ruby-value">1</span>, <span class="ruby-value">b:</span><span class="ruby-value">2</span>, <span class="ruby-value">c:</span><span class="ruby-value">3</span>}
<span class="ruby-identifier">h1</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-identifier">h2</span>   <span class="ruby-comment">#=&gt; true</span>
<span class="ruby-identifier">h2</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-identifier">h1</span>   <span class="ruby-comment">#=&gt; false</span>
<span class="ruby-identifier">h1</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-identifier">h1</span>   <span class="ruby-comment">#=&gt; true</span>
</pre>
          
          

          
          <div class="method-source-code" id="3C-3D-source">
            <pre>static VALUE
rb_hash_le(VALUE hash, VALUE other)
{
    other = to_hash(other);
    if (RHASH_SIZE(hash) &gt; RHASH_SIZE(other)) return Qfalse;
    return hash_le(hash, other);
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-3D-3D" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            hsh == other_hash    &rarr; true or false
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Equality—Two hashes are equal if they each contain the same number of keys and if each key-value pair is equal to (according to Object#==) the corresponding elements in the other hash.</p>

<pre class="ruby"><span class="ruby-identifier">h1</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">1</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">2</span> }
<span class="ruby-identifier">h2</span> = { <span class="ruby-value">7</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">35</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">2</span>, <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">1</span> }
<span class="ruby-identifier">h3</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">1</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">2</span>, <span class="ruby-value">7</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">35</span> }
<span class="ruby-identifier">h4</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">1</span>, <span class="ruby-string">&quot;d&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">2</span>, <span class="ruby-string">&quot;f&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">35</span> }
<span class="ruby-identifier">h1</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">h2</span>   <span class="ruby-comment">#=&gt; false</span>
<span class="ruby-identifier">h2</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">h3</span>   <span class="ruby-comment">#=&gt; true</span>
<span class="ruby-identifier">h3</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">h4</span>   <span class="ruby-comment">#=&gt; false</span>
</pre>

<p>The orders of each hashes are not compared.</p>

<pre class="ruby"><span class="ruby-identifier">h1</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">1</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">2</span> }
<span class="ruby-identifier">h2</span> = { <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">2</span>, <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">1</span> }
<span class="ruby-identifier">h1</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">h2</span>   <span class="ruby-comment">#=&gt; true</span>
</pre>
          
          

          
          <div class="method-source-code" id="3D-3D-source">
            <pre>static VALUE
rb_hash_equal(VALUE hash1, VALUE hash2)
{
    return hash_equal(hash1, hash2, FALSE);
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-3E" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            hash &gt; other &rarr; true or false
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns <code>true</code> if <em>other</em> is subset of <em>hash</em>.</p>

<pre class="ruby"><span class="ruby-identifier">h1</span> = {<span class="ruby-value">a:</span><span class="ruby-value">1</span>, <span class="ruby-value">b:</span><span class="ruby-value">2</span>}
<span class="ruby-identifier">h2</span> = {<span class="ruby-value">a:</span><span class="ruby-value">1</span>, <span class="ruby-value">b:</span><span class="ruby-value">2</span>, <span class="ruby-value">c:</span><span class="ruby-value">3</span>}
<span class="ruby-identifier">h1</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">h2</span>    <span class="ruby-comment">#=&gt; false</span>
<span class="ruby-identifier">h2</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">h1</span>    <span class="ruby-comment">#=&gt; true</span>
<span class="ruby-identifier">h1</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">h1</span>    <span class="ruby-comment">#=&gt; false</span>
</pre>
          
          

          
          <div class="method-source-code" id="3E-source">
            <pre>static VALUE
rb_hash_gt(VALUE hash, VALUE other)
{
    other = to_hash(other);
    if (RHASH_SIZE(hash) &lt;= RHASH_SIZE(other)) return Qfalse;
    return hash_le(other, hash);
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-3E-3D" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            hash &gt;= other &rarr; true or false
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns <code>true</code> if <em>other</em> is subset of <em>hash</em> or equals to <em>hash</em>.</p>

<pre class="ruby"><span class="ruby-identifier">h1</span> = {<span class="ruby-value">a:</span><span class="ruby-value">1</span>, <span class="ruby-value">b:</span><span class="ruby-value">2</span>}
<span class="ruby-identifier">h2</span> = {<span class="ruby-value">a:</span><span class="ruby-value">1</span>, <span class="ruby-value">b:</span><span class="ruby-value">2</span>, <span class="ruby-value">c:</span><span class="ruby-value">3</span>}
<span class="ruby-identifier">h1</span> <span class="ruby-operator">&gt;=</span> <span class="ruby-identifier">h2</span>   <span class="ruby-comment">#=&gt; false</span>
<span class="ruby-identifier">h2</span> <span class="ruby-operator">&gt;=</span> <span class="ruby-identifier">h1</span>   <span class="ruby-comment">#=&gt; true</span>
<span class="ruby-identifier">h1</span> <span class="ruby-operator">&gt;=</span> <span class="ruby-identifier">h1</span>   <span class="ruby-comment">#=&gt; true</span>
</pre>
          
          

          
          <div class="method-source-code" id="3E-3D-source">
            <pre>static VALUE
rb_hash_ge(VALUE hash, VALUE other)
{
    other = to_hash(other);
    if (RHASH_SIZE(hash) &lt; RHASH_SIZE(other)) return Qfalse;
    return hash_le(other, hash);
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-5B-5D" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            hsh[key]    &rarr;  value
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Element Reference—Retrieves the <em>value</em> object corresponding to the <em>key</em> object. If not found, returns the default value (see <a href="Hash.html#method-c-new"><code>Hash::new</code></a> for details).</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;a&quot;</span>]   <span class="ruby-comment">#=&gt; 100</span>
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;c&quot;</span>]   <span class="ruby-comment">#=&gt; nil</span>
</pre>
          
          

          
          <div class="method-source-code" id="5B-5D-source">
            <pre>VALUE
rb_hash_aref(VALUE hash, VALUE key)
{
    st_data_t val;

    if (hash_stlike_lookup(hash, key, &amp;val)) {
        return (VALUE)val;
    }
    else {
        return rb_hash_default_value(hash, key);
    }
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-5B-5D-3D" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            hsh[key] = value        &rarr; value
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <h2 id="method-i-5B-5D-3D-label-Element+Assignment">Element Assignment<span><a href="#method-i-5B-5D-3D-label-Element+Assignment">&para;</a> <a href="#top">&uarr;</a></span></h2>

<p>Associates the value given by <code>value</code> with the key given by <code>key</code>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;a&quot;</span>] = <span class="ruby-value">9</span>
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;c&quot;</span>] = <span class="ruby-value">4</span>
<span class="ruby-identifier">h</span>   <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;9, &quot;b&quot;=&gt;200, &quot;c&quot;=&gt;4}</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">store</span>(<span class="ruby-string">&quot;d&quot;</span>, <span class="ruby-value">42</span>) <span class="ruby-comment">#=&gt; 42</span>
<span class="ruby-identifier">h</span>   <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;9, &quot;b&quot;=&gt;200, &quot;c&quot;=&gt;4, &quot;d&quot;=&gt;42}</span>
</pre>

<p><code>key</code> should not have its value changed while it is in use as a key (an <code>unfrozen String</code> passed as a key will be duplicated and frozen).</p>

<pre class="ruby"><span class="ruby-identifier">a</span> = <span class="ruby-string">&quot;a&quot;</span>
<span class="ruby-identifier">b</span> = <span class="ruby-string">&quot;b&quot;</span>.<span class="ruby-identifier">freeze</span>
<span class="ruby-identifier">h</span> = { <span class="ruby-identifier">a</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-identifier">b</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">key</span>(<span class="ruby-value">100</span>).<span class="ruby-identifier">equal?</span> <span class="ruby-identifier">a</span> <span class="ruby-comment">#=&gt; false</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">key</span>(<span class="ruby-value">200</span>).<span class="ruby-identifier">equal?</span> <span class="ruby-identifier">b</span> <span class="ruby-comment">#=&gt; true</span>
</pre>
          
          

          
          <div class="method-source-code" id="5B-5D-3D-source">
            <pre>VALUE
rb_hash_aset(VALUE hash, VALUE key, VALUE val)
{
    int iter_lev = RHASH_ITER_LEV(hash);

    rb_hash_modify(hash);

    if (RHASH_TABLE_NULL_P(hash)) {
        if (iter_lev &gt; 0) no_new_key();
        ar_alloc_table(hash);
    }

    if (RHASH_TYPE(hash) == &amp;identhash || rb_obj_class(key) != rb_cString) {
        RHASH_UPDATE_ITER(hash, iter_lev, key, hash_aset, val);
    }
    else {
        RHASH_UPDATE_ITER(hash, iter_lev, key, hash_aset_str, val);
    }
    return val;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-any-3F" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            any? [{ |(key, value)| block }]   &rarr; true or false
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            any?(pattern)                     &rarr; true or false
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>See also <a href="Enumerable.html#method-i-any-3F"><code>Enumerable#any?</code></a></p>
          
          

          
          <div class="method-source-code" id="any-3F-source">
            <pre>static VALUE
rb_hash_any_p(int argc, VALUE *argv, VALUE hash)
{
    VALUE args[2];
    args[0] = Qfalse;

    rb_check_arity(argc, 0, 1);
    if (RHASH_EMPTY_P(hash)) return Qfalse;
    if (argc) {
        if (rb_block_given_p()) {
            rb_warn(&quot;given block not used&quot;);
        }
        args[1] = argv[0];

        rb_hash_foreach(hash, any_p_i_pattern, (VALUE)args);
    }
    else {
        if (!rb_block_given_p()) {
            /* yields pairs, never false */
            return Qtrue;
        }
        if (rb_block_arity() &gt; 1)
            rb_hash_foreach(hash, any_p_i_fast, (VALUE)args);
        else
            rb_hash_foreach(hash, any_p_i, (VALUE)args);
    }
    return args[0];
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-assoc" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            assoc(obj)   &rarr;  an_array  or  nil
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Searches through the hash comparing <em>obj</em> with the key using <code>==</code>. Returns the key-value pair (two elements array) or <code>nil</code> if no match is found.  See <a href="Array.html#method-i-assoc"><code>Array#assoc</code></a>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = {<span class="ruby-string">&quot;colors&quot;</span>  <span class="ruby-operator">=&gt;</span> [<span class="ruby-string">&quot;red&quot;</span>, <span class="ruby-string">&quot;blue&quot;</span>, <span class="ruby-string">&quot;green&quot;</span>],
     <span class="ruby-string">&quot;letters&quot;</span> <span class="ruby-operator">=&gt;</span> [<span class="ruby-string">&quot;a&quot;</span>, <span class="ruby-string">&quot;b&quot;</span>, <span class="ruby-string">&quot;c&quot;</span> ]}
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">assoc</span>(<span class="ruby-string">&quot;letters&quot;</span>)  <span class="ruby-comment">#=&gt; [&quot;letters&quot;, [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;]]</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">assoc</span>(<span class="ruby-string">&quot;foo&quot;</span>)      <span class="ruby-comment">#=&gt; nil</span>
</pre>
          
          

          
          <div class="method-source-code" id="assoc-source">
            <pre>VALUE
rb_hash_assoc(VALUE hash, VALUE key)
{
    st_table *table;
    const struct st_hash_type *orighash;
    VALUE args[2];

    if (RHASH_EMPTY_P(hash)) return Qnil;

    ar_force_convert_table(hash, __FILE__, __LINE__);
    HASH_ASSERT(RHASH_ST_TABLE_P(hash));
    table = RHASH_ST_TABLE(hash);
    orighash = table-&gt;type;

    if (orighash != &amp;identhash) {
        VALUE value;
        struct reset_hash_type_arg ensure_arg;
        struct st_hash_type assochash;

        assochash.compare = assoc_cmp;
        assochash.hash = orighash-&gt;hash;
        table-&gt;type = &amp;assochash;
        args[0] = hash;
        args[1] = key;
        ensure_arg.hash = hash;
        ensure_arg.orighash = orighash;
        value = rb_ensure(lookup2_call, (VALUE)&amp;args, reset_hash_type, (VALUE)&amp;ensure_arg);
        if (value != Qundef) return rb_assoc_new(key, value);
    }

    args[0] = key;
    args[1] = Qnil;
    rb_hash_foreach(hash, assoc_i, (VALUE)args);
    return args[1];
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-clear" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            clear &rarr; hsh
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Removes all key-value pairs from <em>hsh</em>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }   <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200}</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">clear</span>                          <span class="ruby-comment">#=&gt; {}</span>
</pre>
          
          

          
          <div class="method-source-code" id="clear-source">
            <pre>VALUE
rb_hash_clear(VALUE hash)
{
    rb_hash_modify_check(hash);

    if (RHASH_ITER_LEV(hash) &gt; 0) {
        rb_hash_foreach(hash, clear_i, 0);
    }
    else if (RHASH_AR_TABLE_P(hash)) {
        ar_clear(hash);
    }
    else {
        st_clear(RHASH_ST_TABLE(hash));
    }

    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-compact" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            compact &rarr; new_hash
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns a new hash with the nil values/key pairs removed</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-value">a:</span> <span class="ruby-value">1</span>, <span class="ruby-value">b:</span> <span class="ruby-keyword">false</span>, <span class="ruby-value">c:</span> <span class="ruby-keyword">nil</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">compact</span>     <span class="ruby-comment">#=&gt; { a: 1, b: false }</span>
<span class="ruby-identifier">h</span>             <span class="ruby-comment">#=&gt; { a: 1, b: false, c: nil }</span>
</pre>
          
          

          
          <div class="method-source-code" id="compact-source">
            <pre>static VALUE
rb_hash_compact(VALUE hash)
{
    VALUE result = rb_hash_new();
    if (!RHASH_EMPTY_P(hash)) {
        rb_hash_foreach(hash, set_if_not_nil, result);
    }
    return result;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-compact-21" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            compact! &rarr; hsh or nil
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Removes all nil values from the hash. Returns nil if no changes were made, otherwise returns the hash.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-value">a:</span> <span class="ruby-value">1</span>, <span class="ruby-value">b:</span> <span class="ruby-keyword">false</span>, <span class="ruby-value">c:</span> <span class="ruby-keyword">nil</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">compact!</span>     <span class="ruby-comment">#=&gt; { a: 1, b: false }</span>
</pre>
          
          

          
          <div class="method-source-code" id="compact-21-source">
            <pre>static VALUE
rb_hash_compact_bang(VALUE hash)
{
    st_index_t n;
    rb_hash_modify_check(hash);
    n = RHASH_SIZE(hash);
    if (n) {
        rb_hash_foreach(hash, delete_if_nil, hash);
        if (n != RHASH_SIZE(hash))
            return hash;
    }
    return Qnil;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-compare_by_identity" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            compare_by_identity &rarr; hsh
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Makes <em>hsh</em> compare its keys by their identity, i.e. it will consider exact same objects as same keys.</p>

<pre class="ruby"><span class="ruby-identifier">h1</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span>, <span class="ruby-value">:c</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;c&quot;</span> }
<span class="ruby-identifier">h1</span>[<span class="ruby-string">&quot;a&quot;</span>]        <span class="ruby-comment">#=&gt; 100</span>
<span class="ruby-identifier">h1</span>.<span class="ruby-identifier">compare_by_identity</span>
<span class="ruby-identifier">h1</span>.<span class="ruby-identifier">compare_by_identity?</span> <span class="ruby-comment">#=&gt; true</span>
<span class="ruby-identifier">h1</span>[<span class="ruby-string">&quot;a&quot;</span>.<span class="ruby-identifier">dup</span>]    <span class="ruby-comment">#=&gt; nil  # different objects.</span>
<span class="ruby-identifier">h1</span>[<span class="ruby-value">:c</span>]         <span class="ruby-comment">#=&gt; &quot;c&quot;  # same symbols are all same.</span>
</pre>
          
          

          
          <div class="method-source-code" id="compare_by_identity-source">
            <pre>static VALUE
rb_hash_compare_by_id(VALUE hash)
{
    VALUE tmp;
    st_table *identtable;

    if (rb_hash_compare_by_id_p(hash)) return hash;

    rb_hash_modify_check(hash);
    ar_force_convert_table(hash, __FILE__, __LINE__);
    HASH_ASSERT(RHASH_ST_TABLE_P(hash));

    tmp = hash_alloc(0);
    identtable = rb_init_identtable_with_size(RHASH_SIZE(hash));
    RHASH_ST_TABLE_SET(tmp, identtable);
    rb_hash_foreach(hash, rb_hash_rehash_i, (VALUE)tmp);
    st_free_table(RHASH_ST_TABLE(hash));
    RHASH_ST_TABLE_SET(hash, identtable);
    RHASH_ST_CLEAR(tmp);
    rb_gc_force_recycle(tmp);

    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-compare_by_identity-3F" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            compare_by_identity? &rarr; true or false
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns <code>true</code> if <em>hsh</em> will compare its keys by their identity.  Also see <a href="Hash.html#method-i-compare_by_identity"><code>Hash#compare_by_identity</code></a>.</p>
          
          

          
          <div class="method-source-code" id="compare_by_identity-3F-source">
            <pre>MJIT_FUNC_EXPORTED VALUE
rb_hash_compare_by_id_p(VALUE hash)
{
    if (RHASH_ST_TABLE_P(hash) &amp;&amp; RHASH_ST_TABLE(hash)-&gt;type == &amp;identhash) {
        return Qtrue;
    }
    else {
        return Qfalse;
    }
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-deconstruct_keys" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">deconstruct_keys</span><span
            class="method-args">(p1)</span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        

        <div class="method-description">
          
          
          
          

          
          <div class="method-source-code" id="deconstruct_keys-source">
            <pre>static VALUE
rb_hash_deconstruct_keys(VALUE hash, VALUE keys)
{
    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-default" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            default(key=nil)   &rarr; obj
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns the default value, the value that would be returned by <em><a href="key">hsh</a></em> if <em>key</em> did not exist in <em>hsh</em>. See also <a href="Hash.html#method-c-new"><code>Hash::new</code></a> and <a href="Hash.html#method-i-default-3D"><code>Hash#default=</code></a>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = <span class="ruby-constant">Hash</span>.<span class="ruby-identifier">new</span>                            <span class="ruby-comment">#=&gt; {}</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">default</span>                               <span class="ruby-comment">#=&gt; nil</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">default</span>(<span class="ruby-value">2</span>)                            <span class="ruby-comment">#=&gt; nil</span>

<span class="ruby-identifier">h</span> = <span class="ruby-constant">Hash</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">&quot;cat&quot;</span>)                     <span class="ruby-comment">#=&gt; {}</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">default</span>                               <span class="ruby-comment">#=&gt; &quot;cat&quot;</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">default</span>(<span class="ruby-value">2</span>)                            <span class="ruby-comment">#=&gt; &quot;cat&quot;</span>

<span class="ruby-identifier">h</span> = <span class="ruby-constant">Hash</span>.<span class="ruby-identifier">new</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">h</span>,<span class="ruby-identifier">k</span><span class="ruby-operator">|</span> <span class="ruby-identifier">h</span>[<span class="ruby-identifier">k</span>] = <span class="ruby-identifier">k</span>.<span class="ruby-identifier">to_i</span><span class="ruby-operator">*</span><span class="ruby-value">10</span>}   <span class="ruby-comment">#=&gt; {}</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">default</span>                               <span class="ruby-comment">#=&gt; nil</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">default</span>(<span class="ruby-value">2</span>)                            <span class="ruby-comment">#=&gt; 20</span>
</pre>
          
          

          
          <div class="method-source-code" id="default-source">
            <pre>static VALUE
rb_hash_default(int argc, VALUE *argv, VALUE hash)
{
    VALUE args[2], ifnone;

    rb_check_arity(argc, 0, 1);
    ifnone = RHASH_IFNONE(hash);
    if (FL_TEST(hash, RHASH_PROC_DEFAULT)) {
        if (argc == 0) return Qnil;
        args[0] = hash;
        args[1] = argv[0];
        return rb_funcallv(ifnone, id_yield, 2, args);
    }
    return ifnone;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-default-3D" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            default = obj     &rarr; obj
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Sets the default value, the value returned for a key that does not exist in the hash. It is not possible to set the default to a <a href="Proc.html"><code>Proc</code></a> that will be executed on each key lookup.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">default</span> = <span class="ruby-string">&quot;Go fish&quot;</span>
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;a&quot;</span>]     <span class="ruby-comment">#=&gt; 100</span>
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;z&quot;</span>]     <span class="ruby-comment">#=&gt; &quot;Go fish&quot;</span>
<span class="ruby-comment"># This doesn&#39;t do what you might hope...</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">default</span> = <span class="ruby-identifier">proc</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">hash</span>, <span class="ruby-identifier">key</span><span class="ruby-operator">|</span>
  <span class="ruby-identifier">hash</span>[<span class="ruby-identifier">key</span>] = <span class="ruby-identifier">key</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">key</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">h</span>[<span class="ruby-value">2</span>]       <span class="ruby-comment">#=&gt; #&lt;Proc:0x401b3948@-:6&gt;</span>
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;cat&quot;</span>]   <span class="ruby-comment">#=&gt; #&lt;Proc:0x401b3948@-:6&gt;</span>
</pre>
          
          

          
          <div class="method-source-code" id="default-3D-source">
            <pre>static VALUE
rb_hash_set_default(VALUE hash, VALUE ifnone)
{
    rb_hash_modify_check(hash);
    SET_DEFAULT(hash, ifnone);
    return ifnone;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-default_proc" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            default_proc &rarr; anObject
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>If <a href="Hash.html#method-c-new"><code>Hash::new</code></a> was invoked with a block, return that block, otherwise return <code>nil</code>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = <span class="ruby-constant">Hash</span>.<span class="ruby-identifier">new</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">h</span>,<span class="ruby-identifier">k</span><span class="ruby-operator">|</span> <span class="ruby-identifier">h</span>[<span class="ruby-identifier">k</span>] = <span class="ruby-identifier">k</span><span class="ruby-operator">*</span><span class="ruby-identifier">k</span> }   <span class="ruby-comment">#=&gt; {}</span>
<span class="ruby-identifier">p</span> = <span class="ruby-identifier">h</span>.<span class="ruby-identifier">default_proc</span>                 <span class="ruby-comment">#=&gt; #&lt;Proc:0x401b3d08@-:1&gt;</span>
<span class="ruby-identifier">a</span> = []                             <span class="ruby-comment">#=&gt; []</span>
<span class="ruby-identifier">p</span>.<span class="ruby-identifier">call</span>(<span class="ruby-identifier">a</span>, <span class="ruby-value">2</span>)
<span class="ruby-identifier">a</span>                                  <span class="ruby-comment">#=&gt; [nil, nil, 4]</span>
</pre>
          
          

          
          <div class="method-source-code" id="default_proc-source">
            <pre>static VALUE
rb_hash_default_proc(VALUE hash)
{
    if (FL_TEST(hash, RHASH_PROC_DEFAULT)) {
        return RHASH_IFNONE(hash);
    }
    return Qnil;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-default_proc-3D" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            default_proc = proc_obj or nil
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Sets the default proc to be executed on each failed key lookup.</p>

<pre class="ruby"><span class="ruby-identifier">h</span>.<span class="ruby-identifier">default_proc</span> = <span class="ruby-identifier">proc</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">hash</span>, <span class="ruby-identifier">key</span><span class="ruby-operator">|</span>
  <span class="ruby-identifier">hash</span>[<span class="ruby-identifier">key</span>] = <span class="ruby-identifier">key</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">key</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">h</span>[<span class="ruby-value">2</span>]       <span class="ruby-comment">#=&gt; 4</span>
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;cat&quot;</span>]   <span class="ruby-comment">#=&gt; &quot;catcat&quot;</span>
</pre>
          
          

          
          <div class="method-source-code" id="default_proc-3D-source">
            <pre>VALUE
rb_hash_set_default_proc(VALUE hash, VALUE proc)
{
    VALUE b;

    rb_hash_modify_check(hash);
    if (NIL_P(proc)) {
        SET_DEFAULT(hash, proc);
        return proc;
    }
    b = rb_check_convert_type_with_id(proc, T_DATA, &quot;Proc&quot;, idTo_proc);
    if (NIL_P(b) || !rb_obj_is_proc(b)) {
        rb_raise(rb_eTypeError,
                 &quot;wrong default_proc type %s (expected Proc)&quot;,
                 rb_obj_classname(proc));
    }
    proc = b;
    SET_PROC_DEFAULT(hash, proc);
    return proc;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-delete" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            delete(key)                   &rarr; value
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            delete(key) {| key | block }  &rarr; value
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Deletes the key-value pair and returns the value from <em>hsh</em> whose key is equal to <em>key</em>. If the key is not found, it returns <em>nil</em>. If the optional code block is given and the key is not found, pass in the key and return the result of <em>block</em>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-string">&quot;a&quot;</span>)                              <span class="ruby-comment">#=&gt; 100</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-string">&quot;z&quot;</span>)                              <span class="ruby-comment">#=&gt; nil</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-string">&quot;z&quot;</span>) { <span class="ruby-operator">|</span><span class="ruby-identifier">el</span><span class="ruby-operator">|</span> <span class="ruby-node">&quot;#{el} not found&quot;</span> }   <span class="ruby-comment">#=&gt; &quot;z not found&quot;</span>
</pre>
          
          

          
          <div class="method-source-code" id="delete-source">
            <pre>static VALUE
rb_hash_delete_m(VALUE hash, VALUE key)
{
    VALUE val;

    rb_hash_modify_check(hash);
    val = rb_hash_delete_entry(hash, key);

    if (val != Qundef) {
        return val;
    }
    else {
        if (rb_block_given_p()) {
            return rb_yield(key);
        }
        else {
            return Qnil;
        }
    }
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-delete_if" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            delete_if {| key, value | block }  &rarr; hsh
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            delete_if                          &rarr; an_enumerator
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Deletes every key-value pair from <em>hsh</em> for which <em>block</em> evaluates to <code>true</code>.</p>

<p>If no block is given, an enumerator is returned instead.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">delete_if</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">key</span>, <span class="ruby-identifier">value</span><span class="ruby-operator">|</span> <span class="ruby-identifier">key</span> <span class="ruby-operator">&gt;=</span> <span class="ruby-string">&quot;b&quot;</span> }   <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100}</span>
</pre>
          
          

          
          <div class="method-source-code" id="delete_if-source">
            <pre>VALUE
rb_hash_delete_if(VALUE hash)
{
    RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
    rb_hash_modify_check(hash);
    if (!RHASH_TABLE_EMPTY_P(hash)) {
        rb_hash_foreach(hash, delete_if_i, hash);
    }
    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-dig" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            dig(key, ...)                 &rarr; object
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Extracts the nested value specified by the sequence of <em>key</em> objects by calling <code>dig</code> at each step, returning <code>nil</code> if any intermediate step is <code>nil</code>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-value">foo:</span> {<span class="ruby-value">bar:</span> {<span class="ruby-value">baz:</span> <span class="ruby-value">1</span>}}}

<span class="ruby-identifier">h</span>.<span class="ruby-identifier">dig</span>(<span class="ruby-value">:foo</span>, <span class="ruby-value">:bar</span>, <span class="ruby-value">:baz</span>)     <span class="ruby-comment">#=&gt; 1</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">dig</span>(<span class="ruby-value">:foo</span>, <span class="ruby-value">:zot</span>, <span class="ruby-value">:xyz</span>)     <span class="ruby-comment">#=&gt; nil</span>

<span class="ruby-identifier">g</span> = { <span class="ruby-value">foo:</span> [<span class="ruby-value">10</span>, <span class="ruby-value">11</span>, <span class="ruby-value">12</span>] }
<span class="ruby-identifier">g</span>.<span class="ruby-identifier">dig</span>(<span class="ruby-value">:foo</span>, <span class="ruby-value">1</span>)              <span class="ruby-comment">#=&gt; 11</span>
<span class="ruby-identifier">g</span>.<span class="ruby-identifier">dig</span>(<span class="ruby-value">:foo</span>, <span class="ruby-value">1</span>, <span class="ruby-value">0</span>)           <span class="ruby-comment">#=&gt; TypeError: Integer does not have #dig method</span>
<span class="ruby-identifier">g</span>.<span class="ruby-identifier">dig</span>(<span class="ruby-value">:foo</span>, <span class="ruby-value">:bar</span>)           <span class="ruby-comment">#=&gt; TypeError: no implicit conversion of Symbol into Integer</span>
</pre>
          
          

          
          <div class="method-source-code" id="dig-source">
            <pre>static VALUE
rb_hash_dig(int argc, VALUE *argv, VALUE self)
{
    rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
    self = rb_hash_aref(self, *argv);
    if (!--argc) return self;
    ++argv;
    return rb_obj_dig(argc, argv, self, Qnil);
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-each" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            each      {| key, value | block } &rarr; hsh
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            each_pair {| key, value | block } &rarr; hsh
          </span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            each                              &rarr; an_enumerator
          </span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            each_pair                         &rarr; an_enumerator
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Calls <em>block</em> once for each key in <em>hsh</em>, passing the key-value pair as parameters.</p>

<p>If no block is given, an enumerator is returned instead.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">key</span>, <span class="ruby-identifier">value</span><span class="ruby-operator">|</span> <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;#{key} is #{value}&quot;</span> }
</pre>

<p><em>produces:</em></p>

<pre class="ruby"><span class="ruby-identifier">a</span> <span class="ruby-identifier">is</span> <span class="ruby-value">100</span>
<span class="ruby-identifier">b</span> <span class="ruby-identifier">is</span> <span class="ruby-value">200</span>
</pre>
          
          

          
          <div class="method-source-code" id="each-source">
            <pre>static VALUE
rb_hash_each_pair(VALUE hash)
{
    RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
    if (rb_block_arity() &gt; 1)
        rb_hash_foreach(hash, each_pair_i_fast, 0);
    else
        rb_hash_foreach(hash, each_pair_i, 0);
    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-each_key" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            each_key {| key | block } &rarr; hsh
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            each_key                  &rarr; an_enumerator
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Calls <em>block</em> once for each key in <em>hsh</em>, passing the key as a parameter.</p>

<p>If no block is given, an enumerator is returned instead.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">each_key</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">key</span><span class="ruby-operator">|</span> <span class="ruby-identifier">puts</span> <span class="ruby-identifier">key</span> }
</pre>

<p><em>produces:</em></p>

<pre class="ruby"><span class="ruby-identifier">a</span>
<span class="ruby-identifier">b</span>
</pre>
          
          

          
          <div class="method-source-code" id="each_key-source">
            <pre>static VALUE
rb_hash_each_key(VALUE hash)
{
    RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
    rb_hash_foreach(hash, each_key_i, 0);
    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-each_pair" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            each_pair {| key, value | block } &rarr; hsh
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            each_pair                         &rarr; an_enumerator
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Calls <em>block</em> once for each key in <em>hsh</em>, passing the key-value pair as parameters.</p>

<p>If no block is given, an enumerator is returned instead.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">key</span>, <span class="ruby-identifier">value</span><span class="ruby-operator">|</span> <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;#{key} is #{value}&quot;</span> }
</pre>

<p><em>produces:</em></p>

<pre class="ruby"><span class="ruby-identifier">a</span> <span class="ruby-identifier">is</span> <span class="ruby-value">100</span>
<span class="ruby-identifier">b</span> <span class="ruby-identifier">is</span> <span class="ruby-value">200</span>
</pre>
          
          

          
          <div class="method-source-code" id="each_pair-source">
            <pre>static VALUE
rb_hash_each_pair(VALUE hash)
{
    RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
    if (rb_block_arity() &gt; 1)
        rb_hash_foreach(hash, each_pair_i_fast, 0);
    else
        rb_hash_foreach(hash, each_pair_i, 0);
    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-each_value" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            each_value {| value | block } &rarr; hsh
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            each_value                    &rarr; an_enumerator
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Calls <em>block</em> once for each key in <em>hsh</em>, passing the value as a parameter.</p>

<p>If no block is given, an enumerator is returned instead.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">each_value</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">value</span><span class="ruby-operator">|</span> <span class="ruby-identifier">puts</span> <span class="ruby-identifier">value</span> }
</pre>

<p><em>produces:</em></p>

<pre class="ruby"><span class="ruby-value">100</span>
<span class="ruby-value">200</span>
</pre>
          
          

          
          <div class="method-source-code" id="each_value-source">
            <pre>static VALUE
rb_hash_each_value(VALUE hash)
{
    RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
    rb_hash_foreach(hash, each_value_i, 0);
    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-empty-3F" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            empty?    &rarr; true or false
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns <code>true</code> if <em>hsh</em> contains no key-value pairs.</p>

<pre class="ruby">{}.<span class="ruby-identifier">empty?</span>   <span class="ruby-comment">#=&gt; true</span>
</pre>
          
          

          
          <div class="method-source-code" id="empty-3F-source">
            <pre>static VALUE
rb_hash_empty_p(VALUE hash)
{
    return RHASH_EMPTY_P(hash) ? Qtrue : Qfalse;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-eql-3F" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            eql?(other)  &rarr; true or false
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns <code>true</code> if <em>hash</em> and <em>other</em> are both hashes with the same content. The orders of each hashes are not compared.</p>
          
          

          
          <div class="method-source-code" id="eql-3F-source">
            <pre>static VALUE
rb_hash_eql(VALUE hash1, VALUE hash2)
{
    return hash_equal(hash1, hash2, TRUE);
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-fetch" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            fetch(key [, default] )       &rarr; obj
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            fetch(key) {| key | block }   &rarr; obj
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns a value from the hash for the given key. If the key can&#39;t be found, there are several options: With no other arguments, it will raise a <a href="KeyError.html"><code>KeyError</code></a> exception; if <em>default</em> is given, then that will be returned; if the optional code block is specified, then that will be run and its result returned.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">fetch</span>(<span class="ruby-string">&quot;a&quot;</span>)                            <span class="ruby-comment">#=&gt; 100</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">fetch</span>(<span class="ruby-string">&quot;z&quot;</span>, <span class="ruby-string">&quot;go fish&quot;</span>)                 <span class="ruby-comment">#=&gt; &quot;go fish&quot;</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">fetch</span>(<span class="ruby-string">&quot;z&quot;</span>) { <span class="ruby-operator">|</span><span class="ruby-identifier">el</span><span class="ruby-operator">|</span> <span class="ruby-node">&quot;go fish, #{el}&quot;</span>}   <span class="ruby-comment">#=&gt; &quot;go fish, z&quot;</span>
</pre>

<p>The following example shows that an exception is raised if the key is not found and a default value is not supplied.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">fetch</span>(<span class="ruby-string">&quot;z&quot;</span>)
</pre>

<p><em>produces:</em></p>

<pre>prog.rb:2:in `fetch&#39;: key not found (KeyError)
 from prog.rb:2</pre>
          
          

          
          <div class="method-source-code" id="fetch-source">
            <pre>static VALUE
rb_hash_fetch_m(int argc, VALUE *argv, VALUE hash)
{
    VALUE key;
    st_data_t val;
    long block_given;

    rb_check_arity(argc, 1, 2);
    key = argv[0];

    block_given = rb_block_given_p();
    if (block_given &amp;&amp; argc == 2) {
        rb_warn(&quot;block supersedes default value argument&quot;);
    }

    if (hash_stlike_lookup(hash, key, &amp;val)) {
        return (VALUE)val;
    }
    else {
        if (block_given) {
            return rb_yield(key);
        }
        else if (argc == 1) {
            VALUE desc = rb_protect(rb_inspect, key, 0);
            if (NIL_P(desc)) {
                desc = rb_any_to_s(key);
            }
            desc = rb_str_ellipsize(desc, 65);
            rb_key_err_raise(rb_sprintf(&quot;key not found: %&quot;PRIsVALUE, desc), hash, key);
        }
        else {
            return argv[1];
        }
    }
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-fetch_values" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            fetch_values(key, ...)                 &rarr; array
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            fetch_values(key, ...) { |key| block } &rarr; array
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns an array containing the values associated with the given keys but also raises <a href="KeyError.html"><code>KeyError</code></a> when one of keys can&#39;t be found. Also see <a href="Hash.html#method-i-values_at"><code>Hash#values_at</code></a> and <a href="Hash.html#method-i-fetch"><code>Hash#fetch</code></a>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;cat&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;feline&quot;</span>, <span class="ruby-string">&quot;dog&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;canine&quot;</span>, <span class="ruby-string">&quot;cow&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;bovine&quot;</span> }

<span class="ruby-identifier">h</span>.<span class="ruby-identifier">fetch_values</span>(<span class="ruby-string">&quot;cow&quot;</span>, <span class="ruby-string">&quot;cat&quot;</span>)                   <span class="ruby-comment">#=&gt; [&quot;bovine&quot;, &quot;feline&quot;]</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">fetch_values</span>(<span class="ruby-string">&quot;cow&quot;</span>, <span class="ruby-string">&quot;bird&quot;</span>)                  <span class="ruby-comment"># raises KeyError</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">fetch_values</span>(<span class="ruby-string">&quot;cow&quot;</span>, <span class="ruby-string">&quot;bird&quot;</span>) { <span class="ruby-operator">|</span><span class="ruby-identifier">k</span><span class="ruby-operator">|</span> <span class="ruby-identifier">k</span>.<span class="ruby-identifier">upcase</span> } <span class="ruby-comment">#=&gt; [&quot;bovine&quot;, &quot;BIRD&quot;]</span>
</pre>
          
          

          
          <div class="method-source-code" id="fetch_values-source">
            <pre>VALUE
rb_hash_fetch_values(int argc, VALUE *argv, VALUE hash)
{
    VALUE result = rb_ary_new2(argc);
    long i;

    for (i=0; i&lt;argc; i++) {
        rb_ary_push(result, rb_hash_fetch(hash, argv[i]));
    }
    return result;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-filter" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            filter {|key, value| block}   &rarr; a_hash
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            filter                        &rarr; an_enumerator
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns a new hash consisting of entries for which the block returns true.</p>

<p>If no block is given, an enumerator is returned instead.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">select</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">k</span>,<span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">k</span> <span class="ruby-operator">&gt;</span> <span class="ruby-string">&quot;a&quot;</span>}  <span class="ruby-comment">#=&gt; {&quot;b&quot; =&gt; 200, &quot;c&quot; =&gt; 300}</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">select</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">k</span>,<span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">v</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">200</span>}  <span class="ruby-comment">#=&gt; {&quot;a&quot; =&gt; 100}</span>
</pre>

<p><a href="Hash.html#method-i-filter"><code>Hash#filter</code></a> is an alias for <a href="Hash.html#method-i-select"><code>Hash#select</code></a>.</p>
          
          

          
          <div class="method-source-code" id="filter-source">
            <pre>VALUE
rb_hash_select(VALUE hash)
{
    VALUE result;

    RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
    result = rb_hash_new();
    if (!RHASH_EMPTY_P(hash)) {
        rb_hash_foreach(hash, select_i, result);
    }
    return result;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-filter-21" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            filter! {| key, value | block }  &rarr; hsh or nil
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            filter!                          &rarr; an_enumerator
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Equivalent to <a href="Hash.html#method-i-keep_if"><code>Hash#keep_if</code></a>, but returns <code>nil</code> if no changes were made.</p>

<p><a href="Hash.html#method-i-filter-21"><code>Hash#filter!</code></a> is an alias for <a href="Hash.html#method-i-select-21"><code>Hash#select!</code></a>.</p>
          
          

          
          <div class="method-source-code" id="filter-21-source">
            <pre>VALUE
rb_hash_select_bang(VALUE hash)
{
    st_index_t n;

    RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
    rb_hash_modify_check(hash);
    n = RHASH_SIZE(hash);
    if (!n) return Qnil;
    rb_hash_foreach(hash, keep_if_i, hash);
    if (n == RHASH_SIZE(hash)) return Qnil;
    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-flatten" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            flatten &rarr; an_array
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            flatten(level) &rarr; an_array
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns a new array that is a one-dimensional flattening of this hash. That is, for every key or value that is an array, extract its elements into the new array.  Unlike <a href="Array.html#method-i-flatten"><code>Array#flatten</code></a>, this method does not flatten recursively by default.  The optional <em>level</em> argument determines the level of recursion to flatten.</p>

<pre class="ruby"><span class="ruby-identifier">a</span> =  {<span class="ruby-value">1</span><span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;one&quot;</span>, <span class="ruby-value">2</span> <span class="ruby-operator">=&gt;</span> [<span class="ruby-value">2</span>,<span class="ruby-string">&quot;two&quot;</span>], <span class="ruby-value">3</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;three&quot;</span>}
<span class="ruby-identifier">a</span>.<span class="ruby-identifier">flatten</span>    <span class="ruby-comment"># =&gt; [1, &quot;one&quot;, 2, [2, &quot;two&quot;], 3, &quot;three&quot;]</span>
<span class="ruby-identifier">a</span>.<span class="ruby-identifier">flatten</span>(<span class="ruby-value">2</span>) <span class="ruby-comment"># =&gt; [1, &quot;one&quot;, 2, 2, &quot;two&quot;, 3, &quot;three&quot;]</span>
</pre>
          
          

          
          <div class="method-source-code" id="flatten-source">
            <pre>static VALUE
rb_hash_flatten(int argc, VALUE *argv, VALUE hash)
{
    VALUE ary;

    rb_check_arity(argc, 0, 1);

    if (argc) {
        int level = NUM2INT(argv[0]);

        if (level == 0) return rb_hash_to_a(hash);

        ary = rb_ary_new_capa(RHASH_SIZE(hash) * 2);
        rb_hash_foreach(hash, flatten_i, ary);
        level--;

        if (level &gt; 0) {
            VALUE ary_flatten_level = INT2FIX(level);
            rb_funcallv(ary, id_flatten_bang, 1, &amp;ary_flatten_level);
        }
        else if (level &lt; 0) {
            /* flatten recursively */
            rb_funcallv(ary, id_flatten_bang, 0, 0);
        }
    }
    else {
        ary = rb_ary_new_capa(RHASH_SIZE(hash) * 2);
        rb_hash_foreach(hash, flatten_i, ary);
    }

    return ary;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-has_key-3F" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            has_key?(key)    &rarr; true or false
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns <code>true</code> if the given key is present in <em>hsh</em>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-string">&quot;a&quot;</span>)   <span class="ruby-comment">#=&gt; true</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-string">&quot;z&quot;</span>)   <span class="ruby-comment">#=&gt; false</span>
</pre>

<p>Note that <a href="Hash.html#method-i-include-3F"><code>include?</code></a> and <a href="Hash.html#method-i-member-3F"><code>member?</code></a> do not test member equality using <code>==</code> as do other Enumerables.</p>

<p>See also <a href="Enumerable.html#method-i-include-3F"><code>Enumerable#include?</code></a></p>
          
          

          
          <div class="method-source-code" id="has_key-3F-source">
            <pre>MJIT_FUNC_EXPORTED VALUE
rb_hash_has_key(VALUE hash, VALUE key)
{
    if (hash_stlike_lookup(hash, key, NULL)) {
        return Qtrue;
    }
    else {
        return Qfalse;
    }
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-has_value-3F" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            has_value?(value)    &rarr; true or false
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns <code>true</code> if the given value is present for some key in <em>hsh</em>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">value?</span>(<span class="ruby-value">100</span>)   <span class="ruby-comment">#=&gt; true</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">value?</span>(<span class="ruby-value">999</span>)   <span class="ruby-comment">#=&gt; false</span>
</pre>
          
          

          
          <div class="method-source-code" id="has_value-3F-source">
            <pre>static VALUE
rb_hash_has_value(VALUE hash, VALUE val)
{
    VALUE data[2];

    data[0] = Qfalse;
    data[1] = val;
    rb_hash_foreach(hash, rb_hash_search_value, (VALUE)data);
    return data[0];
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-hash" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            hash   &rarr; integer
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Compute a hash-code for this hash. Two hashes with the same content will have the same hash code (and will compare using <code>eql?</code>).</p>

<p>See also <a href="Object.html#method-i-hash"><code>Object#hash</code></a>.</p>
          
          

          
          <div class="method-source-code" id="hash-source">
            <pre>static VALUE
rb_hash_hash(VALUE hash)
{
    st_index_t size = RHASH_SIZE(hash);
    st_index_t hval = rb_hash_start(size);
    hval = rb_hash_uint(hval, (st_index_t)rb_hash_hash);
    if (size) {
        rb_hash_foreach(hash, hash_i, (VALUE)&amp;hval);
    }
    hval = rb_hash_end(hval);
    return ST2FIX(hval);
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-include-3F" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            include?(key)    &rarr; true or false
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns <code>true</code> if the given key is present in <em>hsh</em>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-string">&quot;a&quot;</span>)   <span class="ruby-comment">#=&gt; true</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-string">&quot;z&quot;</span>)   <span class="ruby-comment">#=&gt; false</span>
</pre>

<p>Note that <a href="Hash.html#method-i-include-3F"><code>include?</code></a> and <a href="Hash.html#method-i-member-3F"><code>member?</code></a> do not test member equality using <code>==</code> as do other Enumerables.</p>

<p>See also <a href="Enumerable.html#method-i-include-3F"><code>Enumerable#include?</code></a></p>
          
          

          
          <div class="method-source-code" id="include-3F-source">
            <pre>MJIT_FUNC_EXPORTED VALUE
rb_hash_has_key(VALUE hash, VALUE key)
{
    if (hash_stlike_lookup(hash, key, NULL)) {
        return Qtrue;
    }
    else {
        return Qfalse;
    }
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-initialize_copy" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            replace(other_hash) &rarr; hsh
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Replaces the contents of <em>hsh</em> with the contents of <em>other_hash</em>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">replace</span>({ <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span>, <span class="ruby-string">&quot;d&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">400</span> })   <span class="ruby-comment">#=&gt; {&quot;c&quot;=&gt;300, &quot;d&quot;=&gt;400}</span>
</pre>
          
          

          
          <div class="method-source-code" id="initialize_copy-source">
            <pre>static VALUE
rb_hash_replace(VALUE hash, VALUE hash2)
{
    rb_hash_modify_check(hash);
    if (hash == hash2) return hash;
    if (RHASH_ITER_LEV(hash) &gt; 0) {
        rb_raise(rb_eRuntimeError, &quot;can&#39;t replace hash during iteration&quot;);
    }
    hash2 = to_hash(hash2);

    COPY_DEFAULT(hash, hash2);

    if (RHASH_AR_TABLE_P(hash)) {
        if (RHASH_AR_TABLE_P(hash2)) {
            ar_clear(hash);
        }
        else {
            ar_free_and_clear_table(hash);
            RHASH_ST_TABLE_SET(hash, st_init_table_with_size(RHASH_TYPE(hash2), RHASH_SIZE(hash2)));
        }
    }
    else {
        if (RHASH_AR_TABLE_P(hash2)) {
            st_free_table(RHASH_ST_TABLE(hash));
            RHASH_ST_CLEAR(hash);
        }
        else {
            st_clear(RHASH_ST_TABLE(hash));
            RHASH_TBL_RAW(hash)-&gt;type = RHASH_ST_TABLE(hash2)-&gt;type;
        }
    }
    rb_hash_foreach(hash2, rb_hash_rehash_i, (VALUE)hash);

    rb_gc_writebarrier_remember(hash);

    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-inspect" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            to_s     &rarr; string
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            inspect  &rarr; string
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Return the contents of this hash as a string.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span>, <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;d&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">400</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span>  }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">to_s</span>   <span class="ruby-comment">#=&gt; &quot;{\&quot;c\&quot;=&gt;300, \&quot;a\&quot;=&gt;100, \&quot;d\&quot;=&gt;400}&quot;</span>
</pre>
          
          

          
          <div class="method-source-code" id="inspect-source">
            <pre>static VALUE
rb_hash_inspect(VALUE hash)
{
    if (RHASH_EMPTY_P(hash))
        return rb_usascii_str_new2(&quot;{}&quot;);
    return rb_exec_recursive(inspect_hash, hash, 0);
}</pre>
          </div>
          
        </div>

        
        <div class="aliases">
          Also aliased as: <a href="Hash.html#method-i-to_s">to_s</a>
        </div>
        

        
      </div>

    
      <div id="method-i-invert" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            invert &rarr; new_hash
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns a new hash created by using <em>hsh</em>&#39;s values as keys, and the keys as values. If a key with the same value already exists in the <em>hsh</em>, then the last one defined will be used, the earlier value(s) will be discarded.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;n&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;m&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;y&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span>, <span class="ruby-string">&quot;d&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span>, <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">0</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">invert</span>   <span class="ruby-comment">#=&gt; {0=&gt;&quot;a&quot;, 100=&gt;&quot;m&quot;, 200=&gt;&quot;d&quot;, 300=&gt;&quot;y&quot;}</span>
</pre>

<p>If there is no key with the same value, <a href="Hash.html#method-i-invert"><code>Hash#invert</code></a> is involutive.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-value">a:</span> <span class="ruby-value">1</span>, <span class="ruby-value">b:</span> <span class="ruby-value">3</span>, <span class="ruby-value">c:</span> <span class="ruby-value">4</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">invert</span>.<span class="ruby-identifier">invert</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">h</span> <span class="ruby-comment">#=&gt; true</span>
</pre>

<p>The condition, no key with the same value, can be tested by comparing the size of inverted hash.</p>

<pre class="ruby"><span class="ruby-comment"># no key with the same value</span>
<span class="ruby-identifier">h</span> = { <span class="ruby-value">a:</span> <span class="ruby-value">1</span>, <span class="ruby-value">b:</span> <span class="ruby-value">3</span>, <span class="ruby-value">c:</span> <span class="ruby-value">4</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">h</span>.<span class="ruby-identifier">invert</span>.<span class="ruby-identifier">size</span> <span class="ruby-comment">#=&gt; true</span>

<span class="ruby-comment"># two (or more) keys has the same value</span>
<span class="ruby-identifier">h</span> = { <span class="ruby-value">a:</span> <span class="ruby-value">1</span>, <span class="ruby-value">b:</span> <span class="ruby-value">3</span>, <span class="ruby-value">c:</span> <span class="ruby-value">1</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">h</span>.<span class="ruby-identifier">invert</span>.<span class="ruby-identifier">size</span> <span class="ruby-comment">#=&gt; false</span>
</pre>
          
          

          
          <div class="method-source-code" id="invert-source">
            <pre>static VALUE
rb_hash_invert(VALUE hash)
{
    VALUE h = rb_hash_new_with_size(RHASH_SIZE(hash));

    rb_hash_foreach(hash, rb_hash_invert_i, h);
    return h;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-keep_if" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            keep_if {| key, value | block }  &rarr; hsh
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            keep_if                          &rarr; an_enumerator
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Deletes every key-value pair from <em>hsh</em> for which <em>block</em> evaluates to <code>false</code>.</p>

<p>If no block is given, an enumerator is returned instead.</p>

<p>See also <a href="Hash.html#method-i-select-21"><code>Hash#select!</code></a>.</p>
          
          

          
          <div class="method-source-code" id="keep_if-source">
            <pre>VALUE
rb_hash_keep_if(VALUE hash)
{
    RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
    rb_hash_modify_check(hash);
    if (!RHASH_TABLE_EMPTY_P(hash)) {
        rb_hash_foreach(hash, keep_if_i, hash);
    }
    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-key" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            key(value)    &rarr; key
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns the key of an occurrence of a given value. If the value is not found, returns <code>nil</code>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span>, <span class="ruby-string">&quot;d&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">key</span>(<span class="ruby-value">200</span>)   <span class="ruby-comment">#=&gt; &quot;b&quot;</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">key</span>(<span class="ruby-value">300</span>)   <span class="ruby-comment">#=&gt; &quot;c&quot;</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">key</span>(<span class="ruby-value">999</span>)   <span class="ruby-comment">#=&gt; nil</span>
</pre>
          
          

          
          <div class="method-source-code" id="key-source">
            <pre>static VALUE
rb_hash_key(VALUE hash, VALUE value)
{
    VALUE args[2];

    args[0] = value;
    args[1] = Qnil;

    rb_hash_foreach(hash, key_i, (VALUE)args);

    return args[1];
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-key-3F" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            key?(key)        &rarr; true or false
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns <code>true</code> if the given key is present in <em>hsh</em>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-string">&quot;a&quot;</span>)   <span class="ruby-comment">#=&gt; true</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-string">&quot;z&quot;</span>)   <span class="ruby-comment">#=&gt; false</span>
</pre>

<p>Note that <a href="Hash.html#method-i-include-3F"><code>include?</code></a> and <a href="Hash.html#method-i-member-3F"><code>member?</code></a> do not test member equality using <code>==</code> as do other Enumerables.</p>

<p>See also <a href="Enumerable.html#method-i-include-3F"><code>Enumerable#include?</code></a></p>
          
          

          
          <div class="method-source-code" id="key-3F-source">
            <pre>MJIT_FUNC_EXPORTED VALUE
rb_hash_has_key(VALUE hash, VALUE key)
{
    if (hash_stlike_lookup(hash, key, NULL)) {
        return Qtrue;
    }
    else {
        return Qfalse;
    }
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-keys" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            keys    &rarr; array
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns a new array populated with the keys from this hash. See also <a href="Hash.html#method-i-values"><code>Hash#values</code></a>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span>, <span class="ruby-string">&quot;d&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">400</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">keys</span>   <span class="ruby-comment">#=&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;]</span>
</pre>
          
          

          
          <div class="method-source-code" id="keys-source">
            <pre>MJIT_FUNC_EXPORTED VALUE
rb_hash_keys(VALUE hash)
{
    st_index_t size = RHASH_SIZE(hash);
    VALUE keys =  rb_ary_new_capa(size);

    if (size == 0) return keys;

    if (ST_DATA_COMPATIBLE_P(VALUE)) {
        RARRAY_PTR_USE_TRANSIENT(keys, ptr, {
            if (RHASH_AR_TABLE_P(hash)) {
                size = ar_keys(hash, ptr, size);
            }
            else {
                st_table *table = RHASH_ST_TABLE(hash);
                size = st_keys(table, ptr, size);
            }
        });
        rb_gc_writebarrier_remember(keys);
        rb_ary_set_len(keys, size);
    }
    else {
        rb_hash_foreach(hash, keys_i, keys);
    }

    return keys;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-length" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            length    &rarr;  integer
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns the number of key-value pairs in the hash.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;d&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span>, <span class="ruby-string">&quot;v&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span>, <span class="ruby-string">&quot;e&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">400</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">size</span>          <span class="ruby-comment">#=&gt; 4</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-string">&quot;a&quot;</span>)   <span class="ruby-comment">#=&gt; 200</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">size</span>          <span class="ruby-comment">#=&gt; 3</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">length</span>        <span class="ruby-comment">#=&gt; 3</span>
</pre>

<p><a href="Hash.html#method-i-length"><code>Hash#length</code></a> is an alias for <a href="Hash.html#method-i-size"><code>Hash#size</code></a>.</p>
          
          

          
          <div class="method-source-code" id="length-source">
            <pre>VALUE
rb_hash_size(VALUE hash)
{
    return INT2FIX(RHASH_SIZE(hash));
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-member-3F" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            member?(key)     &rarr; true or false
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns <code>true</code> if the given key is present in <em>hsh</em>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-string">&quot;a&quot;</span>)   <span class="ruby-comment">#=&gt; true</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-string">&quot;z&quot;</span>)   <span class="ruby-comment">#=&gt; false</span>
</pre>

<p>Note that <a href="Hash.html#method-i-include-3F"><code>include?</code></a> and <a href="Hash.html#method-i-member-3F"><code>member?</code></a> do not test member equality using <code>==</code> as do other Enumerables.</p>

<p>See also <a href="Enumerable.html#method-i-include-3F"><code>Enumerable#include?</code></a></p>
          
          

          
          <div class="method-source-code" id="member-3F-source">
            <pre>MJIT_FUNC_EXPORTED VALUE
rb_hash_has_key(VALUE hash, VALUE key)
{
    if (hash_stlike_lookup(hash, key, NULL)) {
        return Qtrue;
    }
    else {
        return Qfalse;
    }
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-merge" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            merge(other_hash1, other_hash2, ...)           &rarr; new_hash
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            merge(other_hash1, other_hash2, ...) {|key, oldval, newval| block}
          </span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            &rarr; new_hash
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns a new hash that combines the contents of the receiver and the contents of the given hashes.</p>

<p>If no block is given, entries with duplicate keys are overwritten with the values from each <code>other_hash</code> successively, otherwise the value for each duplicate key is determined by calling the block with the key, its value in the receiver and its value in each <code>other_hash</code>.</p>

<p>When called without any argument, returns a copy of the receiver.</p>

<pre class="ruby"><span class="ruby-identifier">h1</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h2</span> = { <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">246</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span> }
<span class="ruby-identifier">h3</span> = { <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">357</span>, <span class="ruby-string">&quot;d&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">400</span> }
<span class="ruby-identifier">h1</span>.<span class="ruby-identifier">merge</span>          <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200}</span>
<span class="ruby-identifier">h1</span>.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">h2</span>)      <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;246, &quot;c&quot;=&gt;300}</span>
<span class="ruby-identifier">h1</span>.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">h2</span>, <span class="ruby-identifier">h3</span>)  <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;357, &quot;c&quot;=&gt;300, &quot;d&quot;=&gt;400}</span>
<span class="ruby-identifier">h1</span>.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">h2</span>) {<span class="ruby-operator">|</span><span class="ruby-identifier">key</span>, <span class="ruby-identifier">oldval</span>, <span class="ruby-identifier">newval</span><span class="ruby-operator">|</span> <span class="ruby-identifier">newval</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">oldval</span>}
                  <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;46,  &quot;c&quot;=&gt;300}</span>
<span class="ruby-identifier">h1</span>.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">h2</span>, <span class="ruby-identifier">h3</span>) {<span class="ruby-operator">|</span><span class="ruby-identifier">key</span>, <span class="ruby-identifier">oldval</span>, <span class="ruby-identifier">newval</span><span class="ruby-operator">|</span> <span class="ruby-identifier">newval</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">oldval</span>}
                  <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;311, &quot;c&quot;=&gt;300, &quot;d&quot;=&gt;400}</span>
<span class="ruby-identifier">h1</span>                <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200}</span>
</pre>
          
          

          
          <div class="method-source-code" id="merge-source">
            <pre>static VALUE
rb_hash_merge(int argc, VALUE *argv, VALUE self)
{
    return rb_hash_update(argc, argv, rb_hash_dup(self));
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-merge-21" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            merge!(other_hash1, other_hash2, ...)              &rarr; hsh
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            merge!(other_hash1, other_hash2, ...) {|key, oldval, newval| block}
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Adds the contents of the given hashes to the receiver.</p>

<p>If no block is given, entries with duplicate keys are overwritten with the values from each <code>other_hash</code> successively, otherwise the value for each duplicate key is determined by calling the block with the key, its value in the receiver and its value in each <code>other_hash</code>.</p>

<pre class="ruby"><span class="ruby-identifier">h1</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h1</span>.<span class="ruby-identifier">merge!</span>          <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200}</span>
<span class="ruby-identifier">h1</span>                 <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200}</span>

<span class="ruby-identifier">h1</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h2</span> = { <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">246</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span> }
<span class="ruby-identifier">h1</span>.<span class="ruby-identifier">merge!</span>(<span class="ruby-identifier">h2</span>)      <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;246, &quot;c&quot;=&gt;300}</span>
<span class="ruby-identifier">h1</span>                 <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;246, &quot;c&quot;=&gt;300}</span>

<span class="ruby-identifier">h1</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h2</span> = { <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">246</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span> }
<span class="ruby-identifier">h3</span> = { <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">357</span>, <span class="ruby-string">&quot;d&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">400</span> }
<span class="ruby-identifier">h1</span>.<span class="ruby-identifier">merge!</span>(<span class="ruby-identifier">h2</span>, <span class="ruby-identifier">h3</span>)
                   <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;357, &quot;c&quot;=&gt;300, &quot;d&quot;=&gt;400}</span>
<span class="ruby-identifier">h1</span>                 <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;357, &quot;c&quot;=&gt;300, &quot;d&quot;=&gt;400}</span>

<span class="ruby-identifier">h1</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h2</span> = { <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">246</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span> }
<span class="ruby-identifier">h3</span> = { <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">357</span>, <span class="ruby-string">&quot;d&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">400</span> }
<span class="ruby-identifier">h1</span>.<span class="ruby-identifier">merge!</span>(<span class="ruby-identifier">h2</span>, <span class="ruby-identifier">h3</span>) {<span class="ruby-operator">|</span><span class="ruby-identifier">key</span>, <span class="ruby-identifier">v1</span>, <span class="ruby-identifier">v2</span><span class="ruby-operator">|</span> <span class="ruby-identifier">v1</span> }
                   <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200, &quot;c&quot;=&gt;300, &quot;d&quot;=&gt;400}</span>
<span class="ruby-identifier">h1</span>                 <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200, &quot;c&quot;=&gt;300, &quot;d&quot;=&gt;400}</span>
</pre>

<p><a href="Hash.html#method-i-update"><code>Hash#update</code></a> is an alias for <a href="Hash.html#method-i-merge-21"><code>Hash#merge!</code></a>.</p>
          
          

          
          <div class="method-source-code" id="merge-21-source">
            <pre>static VALUE
rb_hash_update(int argc, VALUE *argv, VALUE self)
{
    int i;
    bool block_given = rb_block_given_p();

    rb_hash_modify(self);
    for (i = 0; i &lt; argc; i++){
       VALUE hash = to_hash(argv[i]);
       if (block_given) {
           rb_hash_foreach(hash, rb_hash_update_block_i, self);
       }
       else {
           rb_hash_foreach(hash, rb_hash_update_i, self);
       }
    }
    return self;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-rassoc" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            rassoc(obj) &rarr; an_array or nil
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Searches through the hash comparing <em>obj</em> with the value using <code>==</code>. Returns the first key-value pair (two-element array) that matches. See also <a href="Array.html#method-i-rassoc"><code>Array#rassoc</code></a>.</p>

<pre class="ruby"><span class="ruby-identifier">a</span> = {<span class="ruby-value">1</span><span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;one&quot;</span>, <span class="ruby-value">2</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;two&quot;</span>, <span class="ruby-value">3</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;three&quot;</span>, <span class="ruby-string">&quot;ii&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;two&quot;</span>}
<span class="ruby-identifier">a</span>.<span class="ruby-identifier">rassoc</span>(<span class="ruby-string">&quot;two&quot;</span>)    <span class="ruby-comment">#=&gt; [2, &quot;two&quot;]</span>
<span class="ruby-identifier">a</span>.<span class="ruby-identifier">rassoc</span>(<span class="ruby-string">&quot;four&quot;</span>)   <span class="ruby-comment">#=&gt; nil</span>
</pre>
          
          

          
          <div class="method-source-code" id="rassoc-source">
            <pre>VALUE
rb_hash_rassoc(VALUE hash, VALUE obj)
{
    VALUE args[2];

    args[0] = obj;
    args[1] = Qnil;
    rb_hash_foreach(hash, rassoc_i, (VALUE)args);
    return args[1];
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-rehash" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            rehash &rarr; hsh
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Rebuilds the hash based on the current hash values for each key. If values of key objects have changed since they were inserted, this method will reindex <em>hsh</em>. If <a href="Hash.html#method-i-rehash"><code>Hash#rehash</code></a> is called while an iterator is traversing the hash, a <a href="RuntimeError.html"><code>RuntimeError</code></a> will be raised in the iterator.</p>

<pre class="ruby"><span class="ruby-identifier">a</span> = [ <span class="ruby-string">&quot;a&quot;</span>, <span class="ruby-string">&quot;b&quot;</span> ]
<span class="ruby-identifier">c</span> = [ <span class="ruby-string">&quot;c&quot;</span>, <span class="ruby-string">&quot;d&quot;</span> ]
<span class="ruby-identifier">h</span> = { <span class="ruby-identifier">a</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-identifier">c</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span> }
<span class="ruby-identifier">h</span>[<span class="ruby-identifier">a</span>]       <span class="ruby-comment">#=&gt; 100</span>
<span class="ruby-identifier">a</span>[<span class="ruby-value">0</span>] = <span class="ruby-string">&quot;z&quot;</span>
<span class="ruby-identifier">h</span>[<span class="ruby-identifier">a</span>]       <span class="ruby-comment">#=&gt; nil</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">rehash</span>   <span class="ruby-comment">#=&gt; {[&quot;z&quot;, &quot;b&quot;]=&gt;100, [&quot;c&quot;, &quot;d&quot;]=&gt;300}</span>
<span class="ruby-identifier">h</span>[<span class="ruby-identifier">a</span>]       <span class="ruby-comment">#=&gt; 100</span>
</pre>
          
          

          
          <div class="method-source-code" id="rehash-source">
            <pre>VALUE
rb_hash_rehash(VALUE hash)
{
    VALUE tmp;
    st_table *tbl;

    if (RHASH_ITER_LEV(hash) &gt; 0) {
        rb_raise(rb_eRuntimeError, &quot;rehash during iteration&quot;);
    }
    rb_hash_modify_check(hash);
    if (RHASH_AR_TABLE_P(hash)) {
        tmp = hash_alloc(0);
        ar_alloc_table(tmp);
        rb_hash_foreach(hash, rb_hash_rehash_i, (VALUE)tmp);
        ar_free_and_clear_table(hash);
        ar_copy(hash, tmp);
        ar_free_and_clear_table(tmp);
    }
    else if (RHASH_ST_TABLE_P(hash)) {
        st_table *old_tab = RHASH_ST_TABLE(hash);
        tmp = hash_alloc(0);
        tbl = st_init_table_with_size(old_tab-&gt;type, old_tab-&gt;num_entries);
        RHASH_ST_TABLE_SET(tmp, tbl);
        rb_hash_foreach(hash, rb_hash_rehash_i, (VALUE)tmp);
        st_free_table(old_tab);
        RHASH_ST_TABLE_SET(hash, tbl);
        RHASH_ST_CLEAR(tmp);
    }
    hash_verify(hash);
    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-reject" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            reject {|key, value| block}   &rarr; a_hash
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            reject                        &rarr; an_enumerator
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns a new hash consisting of entries for which the block returns false.</p>

<p>If no block is given, an enumerator is returned instead.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">reject</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">k</span>,<span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">k</span> <span class="ruby-operator">&lt;</span> <span class="ruby-string">&quot;b&quot;</span>}  <span class="ruby-comment">#=&gt; {&quot;b&quot; =&gt; 200, &quot;c&quot; =&gt; 300}</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">reject</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">k</span>,<span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">v</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">100</span>}  <span class="ruby-comment">#=&gt; {&quot;a&quot; =&gt; 100}</span>
</pre>
          
          

          
          <div class="method-source-code" id="reject-source">
            <pre>VALUE
rb_hash_reject(VALUE hash)
{
    VALUE result;

    RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
    if (RTEST(ruby_verbose)) {
        VALUE klass;
        if (HAS_EXTRA_STATES(hash, klass)) {
            rb_warn(&quot;extra states are no longer copied: %+&quot;PRIsVALUE, hash);
        }
    }
    result = rb_hash_new();
    if (!RHASH_EMPTY_P(hash)) {
        rb_hash_foreach(hash, reject_i, result);
    }
    return result;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-reject-21" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            reject! {| key, value | block }  &rarr; hsh or nil
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            reject!                          &rarr; an_enumerator
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Equivalent to <a href="Hash.html#method-i-delete_if"><code>Hash#delete_if</code></a>, but returns <code>nil</code> if no changes were made.</p>
          
          

          
          <div class="method-source-code" id="reject-21-source">
            <pre>VALUE
rb_hash_reject_bang(VALUE hash)
{
    st_index_t n;

    RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
    rb_hash_modify(hash);
    n = RHASH_SIZE(hash);
    if (!n) return Qnil;
    rb_hash_foreach(hash, delete_if_i, hash);
    if (n == RHASH_SIZE(hash)) return Qnil;
    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-replace" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            replace(other_hash) &rarr; hsh
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Replaces the contents of <em>hsh</em> with the contents of <em>other_hash</em>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">replace</span>({ <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span>, <span class="ruby-string">&quot;d&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">400</span> })   <span class="ruby-comment">#=&gt; {&quot;c&quot;=&gt;300, &quot;d&quot;=&gt;400}</span>
</pre>
          
          

          
          <div class="method-source-code" id="replace-source">
            <pre>static VALUE
rb_hash_replace(VALUE hash, VALUE hash2)
{
    rb_hash_modify_check(hash);
    if (hash == hash2) return hash;
    if (RHASH_ITER_LEV(hash) &gt; 0) {
        rb_raise(rb_eRuntimeError, &quot;can&#39;t replace hash during iteration&quot;);
    }
    hash2 = to_hash(hash2);

    COPY_DEFAULT(hash, hash2);

    if (RHASH_AR_TABLE_P(hash)) {
        if (RHASH_AR_TABLE_P(hash2)) {
            ar_clear(hash);
        }
        else {
            ar_free_and_clear_table(hash);
            RHASH_ST_TABLE_SET(hash, st_init_table_with_size(RHASH_TYPE(hash2), RHASH_SIZE(hash2)));
        }
    }
    else {
        if (RHASH_AR_TABLE_P(hash2)) {
            st_free_table(RHASH_ST_TABLE(hash));
            RHASH_ST_CLEAR(hash);
        }
        else {
            st_clear(RHASH_ST_TABLE(hash));
            RHASH_TBL_RAW(hash)-&gt;type = RHASH_ST_TABLE(hash2)-&gt;type;
        }
    }
    rb_hash_foreach(hash2, rb_hash_rehash_i, (VALUE)hash);

    rb_gc_writebarrier_remember(hash);

    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-select" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            select {|key, value| block}   &rarr; a_hash
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            select                        &rarr; an_enumerator
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns a new hash consisting of entries for which the block returns true.</p>

<p>If no block is given, an enumerator is returned instead.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">select</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">k</span>,<span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">k</span> <span class="ruby-operator">&gt;</span> <span class="ruby-string">&quot;a&quot;</span>}  <span class="ruby-comment">#=&gt; {&quot;b&quot; =&gt; 200, &quot;c&quot; =&gt; 300}</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">select</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">k</span>,<span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">v</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">200</span>}  <span class="ruby-comment">#=&gt; {&quot;a&quot; =&gt; 100}</span>
</pre>

<p><a href="Hash.html#method-i-filter"><code>Hash#filter</code></a> is an alias for <a href="Hash.html#method-i-select"><code>Hash#select</code></a>.</p>
          
          

          
          <div class="method-source-code" id="select-source">
            <pre>VALUE
rb_hash_select(VALUE hash)
{
    VALUE result;

    RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
    result = rb_hash_new();
    if (!RHASH_EMPTY_P(hash)) {
        rb_hash_foreach(hash, select_i, result);
    }
    return result;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-select-21" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            select! {| key, value | block }  &rarr; hsh or nil
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            select!                          &rarr; an_enumerator
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Equivalent to <a href="Hash.html#method-i-keep_if"><code>Hash#keep_if</code></a>, but returns <code>nil</code> if no changes were made.</p>

<p><a href="Hash.html#method-i-filter-21"><code>Hash#filter!</code></a> is an alias for <a href="Hash.html#method-i-select-21"><code>Hash#select!</code></a>.</p>
          
          

          
          <div class="method-source-code" id="select-21-source">
            <pre>VALUE
rb_hash_select_bang(VALUE hash)
{
    st_index_t n;

    RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
    rb_hash_modify_check(hash);
    n = RHASH_SIZE(hash);
    if (!n) return Qnil;
    rb_hash_foreach(hash, keep_if_i, hash);
    if (n == RHASH_SIZE(hash)) return Qnil;
    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-shift" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            shift &rarr; anArray or obj
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Removes a key-value pair from <em>hsh</em> and returns it as the two-item array <code>[</code> <em>key, value</em> <code>]</code>, or the hash&#39;s default value if the hash is empty.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-value">1</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;a&quot;</span>, <span class="ruby-value">2</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;b&quot;</span>, <span class="ruby-value">3</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;c&quot;</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">shift</span>   <span class="ruby-comment">#=&gt; [1, &quot;a&quot;]</span>
<span class="ruby-identifier">h</span>         <span class="ruby-comment">#=&gt; {2=&gt;&quot;b&quot;, 3=&gt;&quot;c&quot;}</span>
</pre>
          
          

          
          <div class="method-source-code" id="shift-source">
            <pre>static VALUE
rb_hash_shift(VALUE hash)
{
    struct shift_var var;

    rb_hash_modify_check(hash);
    if (RHASH_AR_TABLE_P(hash)) {
        var.key = Qundef;
        if (RHASH_ITER_LEV(hash) == 0) {
            if (ar_shift(hash, &amp;var.key, &amp;var.val)) {
                return rb_assoc_new(var.key, var.val);
            }
        }
        else {
            rb_hash_foreach(hash, shift_i_safe, (VALUE)&amp;var);
            if (var.key != Qundef) {
                rb_hash_delete_entry(hash, var.key);
                return rb_assoc_new(var.key, var.val);
            }
        }
    }
    if (RHASH_ST_TABLE_P(hash)) {
        var.key = Qundef;
        if (RHASH_ITER_LEV(hash) == 0) {
            if (st_shift(RHASH_ST_TABLE(hash), &amp;var.key, &amp;var.val)) {
                return rb_assoc_new(var.key, var.val);
            }
        }
        else {
            rb_hash_foreach(hash, shift_i_safe, (VALUE)&amp;var);
            if (var.key != Qundef) {
                rb_hash_delete_entry(hash, var.key);
                return rb_assoc_new(var.key, var.val);
            }
        }
    }
    return rb_hash_default_value(hash, Qnil);
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-size" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            size      &rarr;  integer
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns the number of key-value pairs in the hash.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;d&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span>, <span class="ruby-string">&quot;v&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span>, <span class="ruby-string">&quot;e&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">400</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">size</span>          <span class="ruby-comment">#=&gt; 4</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-string">&quot;a&quot;</span>)   <span class="ruby-comment">#=&gt; 200</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">size</span>          <span class="ruby-comment">#=&gt; 3</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">length</span>        <span class="ruby-comment">#=&gt; 3</span>
</pre>

<p><a href="Hash.html#method-i-length"><code>Hash#length</code></a> is an alias for <a href="Hash.html#method-i-size"><code>Hash#size</code></a>.</p>
          
          

          
          <div class="method-source-code" id="size-source">
            <pre>VALUE
rb_hash_size(VALUE hash)
{
    return INT2FIX(RHASH_SIZE(hash));
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-slice" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            slice(*keys) &rarr; a_hash
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns a hash containing only the given keys and their values.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-value">a:</span> <span class="ruby-value">100</span>, <span class="ruby-value">b:</span> <span class="ruby-value">200</span>, <span class="ruby-value">c:</span> <span class="ruby-value">300</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">slice</span>(<span class="ruby-value">:a</span>)           <span class="ruby-comment">#=&gt; {:a=&gt;100}</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">slice</span>(<span class="ruby-value">:b</span>, <span class="ruby-value">:c</span>, <span class="ruby-value">:d</span>)   <span class="ruby-comment">#=&gt; {:b=&gt;200, :c=&gt;300}</span>
</pre>
          
          

          
          <div class="method-source-code" id="slice-source">
            <pre>static VALUE
rb_hash_slice(int argc, VALUE *argv, VALUE hash)
{
    int i;
    VALUE key, value, result;

    if (argc == 0 || RHASH_EMPTY_P(hash)) {
        return rb_hash_new();
    }
    result = rb_hash_new_with_size(argc);

    for (i = 0; i &lt; argc; i++) {
        key = argv[i];
        value = rb_hash_lookup2(hash, key, Qundef);
        if (value != Qundef)
            rb_hash_aset(result, key, value);
    }

    return result;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-store" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            store(key, value)   &rarr; value
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <h2 id="method-i-store-label-Element+Assignment">Element Assignment<span><a href="#method-i-store-label-Element+Assignment">&para;</a> <a href="#top">&uarr;</a></span></h2>

<p>Associates the value given by <code>value</code> with the key given by <code>key</code>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;a&quot;</span>] = <span class="ruby-value">9</span>
<span class="ruby-identifier">h</span>[<span class="ruby-string">&quot;c&quot;</span>] = <span class="ruby-value">4</span>
<span class="ruby-identifier">h</span>   <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;9, &quot;b&quot;=&gt;200, &quot;c&quot;=&gt;4}</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">store</span>(<span class="ruby-string">&quot;d&quot;</span>, <span class="ruby-value">42</span>) <span class="ruby-comment">#=&gt; 42</span>
<span class="ruby-identifier">h</span>   <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;9, &quot;b&quot;=&gt;200, &quot;c&quot;=&gt;4, &quot;d&quot;=&gt;42}</span>
</pre>

<p><code>key</code> should not have its value changed while it is in use as a key (an <code>unfrozen String</code> passed as a key will be duplicated and frozen).</p>

<pre class="ruby"><span class="ruby-identifier">a</span> = <span class="ruby-string">&quot;a&quot;</span>
<span class="ruby-identifier">b</span> = <span class="ruby-string">&quot;b&quot;</span>.<span class="ruby-identifier">freeze</span>
<span class="ruby-identifier">h</span> = { <span class="ruby-identifier">a</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-identifier">b</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">key</span>(<span class="ruby-value">100</span>).<span class="ruby-identifier">equal?</span> <span class="ruby-identifier">a</span> <span class="ruby-comment">#=&gt; false</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">key</span>(<span class="ruby-value">200</span>).<span class="ruby-identifier">equal?</span> <span class="ruby-identifier">b</span> <span class="ruby-comment">#=&gt; true</span>
</pre>
          
          

          
          <div class="method-source-code" id="store-source">
            <pre>VALUE
rb_hash_aset(VALUE hash, VALUE key, VALUE val)
{
    int iter_lev = RHASH_ITER_LEV(hash);

    rb_hash_modify(hash);

    if (RHASH_TABLE_NULL_P(hash)) {
        if (iter_lev &gt; 0) no_new_key();
        ar_alloc_table(hash);
    }

    if (RHASH_TYPE(hash) == &amp;identhash || rb_obj_class(key) != rb_cString) {
        RHASH_UPDATE_ITER(hash, iter_lev, key, hash_aset, val);
    }
    else {
        RHASH_UPDATE_ITER(hash, iter_lev, key, hash_aset_str, val);
    }
    return val;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-to_a" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            to_a &rarr; array
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Converts <em>hsh</em> to a nested array of <code>[</code> <em>key, value</em> <code>]</code> arrays.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span>, <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;d&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">400</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span>  }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">to_a</span>   <span class="ruby-comment">#=&gt; [[&quot;c&quot;, 300], [&quot;a&quot;, 100], [&quot;d&quot;, 400]]</span>
</pre>
          
          

          
          <div class="method-source-code" id="to_a-source">
            <pre>static VALUE
rb_hash_to_a(VALUE hash)
{
    VALUE ary;

    ary = rb_ary_new_capa(RHASH_SIZE(hash));
    rb_hash_foreach(hash, to_a_i, ary);

    return ary;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-to_h" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            to_h                         &rarr; hsh or new_hash
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            to_h {|key, value| block }   &rarr; new_hash
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns <code>self</code>. If called on a subclass of <a href="Hash.html"><code>Hash</code></a>, converts the receiver to a <a href="Hash.html"><code>Hash</code></a> object.</p>

<p>If a block is given, the results of the block on each pair of the receiver will be used as pairs.</p>
          
          

          
          <div class="method-source-code" id="to_h-source">
            <pre>static VALUE
rb_hash_to_h(VALUE hash)
{
    if (rb_block_given_p()) {
        return rb_hash_to_h_block(hash);
    }
    if (rb_obj_class(hash) != rb_cHash) {
        const VALUE flags = RBASIC(hash)-&gt;flags;
        hash = hash_dup(hash, rb_cHash, flags &amp; RHASH_PROC_DEFAULT);
    }
    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-to_hash" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            to_hash   &rarr; hsh
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns <code>self</code>.</p>
          
          

          
          <div class="method-source-code" id="to_hash-source">
            <pre>static VALUE
rb_hash_to_hash(VALUE hash)
{
    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-to_proc" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            to_proc &rarr; proc
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns a <a href="Proc.html"><code>Proc</code></a> which maps keys to values.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = {<span class="ruby-value">a:</span><span class="ruby-value">1</span>, <span class="ruby-value">b:</span><span class="ruby-value">2</span>}
<span class="ruby-identifier">hp</span> = <span class="ruby-identifier">h</span>.<span class="ruby-identifier">to_proc</span>
<span class="ruby-identifier">hp</span>.<span class="ruby-identifier">call</span>(<span class="ruby-value">:a</span>)          <span class="ruby-comment">#=&gt; 1</span>
<span class="ruby-identifier">hp</span>.<span class="ruby-identifier">call</span>(<span class="ruby-value">:b</span>)          <span class="ruby-comment">#=&gt; 2</span>
<span class="ruby-identifier">hp</span>.<span class="ruby-identifier">call</span>(<span class="ruby-value">:c</span>)          <span class="ruby-comment">#=&gt; nil</span>
[<span class="ruby-value">:a</span>, <span class="ruby-value">:b</span>, <span class="ruby-value">:c</span>].<span class="ruby-identifier">map</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">h</span>) <span class="ruby-comment">#=&gt; [1, 2, nil]</span>
</pre>
          
          

          
          <div class="method-source-code" id="to_proc-source">
            <pre>static VALUE
rb_hash_to_proc(VALUE hash)
{
    return rb_func_proc_new(hash_proc_call, hash);
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-to_s" class="method-detail method-alias">
        
        <div class="method-heading">
          <span class="method-name">to_s</span><span
            class="method-args">()</span>
          
        </div>
        

        <div class="method-description">
          
          
          
          

          
        </div>

        

        
        <div class="aliases">
          Alias for: <a href="Hash.html#method-i-inspect">inspect</a>
        </div>
        
      </div>

    
      <div id="method-i-transform_keys" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            transform_keys {|key| block } &rarr; new_hash
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            transform_keys                &rarr; an_enumerator
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns a new hash with the results of running the block once for every key. This method does not change the values.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-value">a:</span> <span class="ruby-value">1</span>, <span class="ruby-value">b:</span> <span class="ruby-value">2</span>, <span class="ruby-value">c:</span> <span class="ruby-value">3</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">transform_keys</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">k</span><span class="ruby-operator">|</span> <span class="ruby-identifier">k</span>.<span class="ruby-identifier">to_s</span> }  <span class="ruby-comment">#=&gt; { &quot;a&quot; =&gt; 1, &quot;b&quot; =&gt; 2, &quot;c&quot; =&gt; 3 }</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">transform_keys</span>(<span class="ruby-operator">&amp;</span><span class="ruby-value">:to_s</span>)        <span class="ruby-comment">#=&gt; { &quot;a&quot; =&gt; 1, &quot;b&quot; =&gt; 2, &quot;c&quot; =&gt; 3 }</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">transform_keys</span>.<span class="ruby-identifier">with_index</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">k</span>, <span class="ruby-identifier">i</span><span class="ruby-operator">|</span> <span class="ruby-node">&quot;#{k}.#{i}&quot;</span> }
                                <span class="ruby-comment">#=&gt; { &quot;a.0&quot; =&gt; 1, &quot;b.1&quot; =&gt; 2, &quot;c.2&quot; =&gt; 3 }</span>
</pre>

<p>If no block is given, an enumerator is returned instead.</p>
          
          

          
          <div class="method-source-code" id="transform_keys-source">
            <pre>static VALUE
rb_hash_transform_keys(VALUE hash)
{
    VALUE result;

    RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
    result = rb_hash_new();
    if (!RHASH_EMPTY_P(hash)) {
        rb_hash_foreach(hash, transform_keys_i, result);
    }

    return result;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-transform_keys-21" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            transform_keys! {|key| block } &rarr; hsh
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            transform_keys!                &rarr; an_enumerator
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Invokes the given block once for each key in <em>hsh</em>, replacing it with the new key returned by the block, and then returns <em>hsh</em>. This method does not change the values.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-value">a:</span> <span class="ruby-value">1</span>, <span class="ruby-value">b:</span> <span class="ruby-value">2</span>, <span class="ruby-value">c:</span> <span class="ruby-value">3</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">transform_keys!</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">k</span><span class="ruby-operator">|</span> <span class="ruby-identifier">k</span>.<span class="ruby-identifier">to_s</span> }  <span class="ruby-comment">#=&gt; { &quot;a&quot; =&gt; 1, &quot;b&quot; =&gt; 2, &quot;c&quot; =&gt; 3 }</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">transform_keys!</span>(<span class="ruby-operator">&amp;</span><span class="ruby-value">:to_sym</span>)      <span class="ruby-comment">#=&gt; { a: 1, b: 2, c: 3 }</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">transform_keys!</span>.<span class="ruby-identifier">with_index</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">k</span>, <span class="ruby-identifier">i</span><span class="ruby-operator">|</span> <span class="ruby-node">&quot;#{k}.#{i}&quot;</span> }
                                 <span class="ruby-comment">#=&gt; { &quot;a.0&quot; =&gt; 1, &quot;b.1&quot; =&gt; 2, &quot;c.2&quot; =&gt; 3 }</span>
</pre>

<p>If no block is given, an enumerator is returned instead.</p>
          
          

          
          <div class="method-source-code" id="transform_keys-21-source">
            <pre>static VALUE
rb_hash_transform_keys_bang(VALUE hash)
{
    RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
    rb_hash_modify_check(hash);
    if (!RHASH_TABLE_EMPTY_P(hash)) {
        long i;
        VALUE pairs = rb_hash_flatten(0, NULL, hash);
        rb_hash_clear(hash);
        for (i = 0; i &lt; RARRAY_LEN(pairs); i += 2) {
            VALUE key = RARRAY_AREF(pairs, i), new_key = rb_yield(key),
                  val = RARRAY_AREF(pairs, i+1);
            rb_hash_aset(hash, new_key, val);
        }
    }
    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-transform_values" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            transform_values {|value| block } &rarr; new_hash
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            transform_values                  &rarr; an_enumerator
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns a new hash with the results of running the block once for every value. This method does not change the keys.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-value">a:</span> <span class="ruby-value">1</span>, <span class="ruby-value">b:</span> <span class="ruby-value">2</span>, <span class="ruby-value">c:</span> <span class="ruby-value">3</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">transform_values</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">v</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">v</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span> }  <span class="ruby-comment">#=&gt; { a: 2, b: 5, c: 10 }</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">transform_values</span>(<span class="ruby-operator">&amp;</span><span class="ruby-value">:to_s</span>)           <span class="ruby-comment">#=&gt; { a: &quot;1&quot;, b: &quot;2&quot;, c: &quot;3&quot; }</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">transform_values</span>.<span class="ruby-identifier">with_index</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">v</span>, <span class="ruby-identifier">i</span><span class="ruby-operator">|</span> <span class="ruby-node">&quot;#{v}.#{i}&quot;</span> }
                                     <span class="ruby-comment">#=&gt; { a: &quot;1.0&quot;, b: &quot;2.1&quot;, c: &quot;3.2&quot; }</span>
</pre>

<p>If no block is given, an enumerator is returned instead.</p>
          
          

          
          <div class="method-source-code" id="transform_values-source">
            <pre>static VALUE
rb_hash_transform_values(VALUE hash)
{
    VALUE result;

    RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
    result = hash_copy(hash_alloc(rb_cHash), hash);
    SET_DEFAULT(result, Qnil);

    if (!RHASH_EMPTY_P(hash)) {
        rb_hash_stlike_foreach_with_replace(result, transform_values_foreach_func, transform_values_foreach_replace, result);
    }

    return result;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-transform_values-21" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            transform_values! {|value| block } &rarr; hsh
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            transform_values!                  &rarr; an_enumerator
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Invokes the given block once for each value in <em>hsh</em>, replacing it with the new value returned by the block, and then returns <em>hsh</em>. This method does not change the keys.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-value">a:</span> <span class="ruby-value">1</span>, <span class="ruby-value">b:</span> <span class="ruby-value">2</span>, <span class="ruby-value">c:</span> <span class="ruby-value">3</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">transform_values!</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">v</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">v</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span> }  <span class="ruby-comment">#=&gt; { a: 2, b: 5, c: 10 }</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">transform_values!</span>(<span class="ruby-operator">&amp;</span><span class="ruby-value">:to_s</span>)           <span class="ruby-comment">#=&gt; { a: &quot;2&quot;, b: &quot;5&quot;, c: &quot;10&quot; }</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">transform_values!</span>.<span class="ruby-identifier">with_index</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">v</span>, <span class="ruby-identifier">i</span><span class="ruby-operator">|</span> <span class="ruby-node">&quot;#{v}.#{i}&quot;</span> }
                                      <span class="ruby-comment">#=&gt; { a: &quot;2.0&quot;, b: &quot;5.1&quot;, c: &quot;10.2&quot; }</span>
</pre>

<p>If no block is given, an enumerator is returned instead.</p>
          
          

          
          <div class="method-source-code" id="transform_values-21-source">
            <pre>static VALUE
rb_hash_transform_values_bang(VALUE hash)
{
    RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
    rb_hash_modify_check(hash);

    if (!RHASH_TABLE_EMPTY_P(hash)) {
        rb_hash_stlike_foreach_with_replace(hash, transform_values_foreach_func, transform_values_foreach_replace, hash);
    }

    return hash;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-update" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            update(other_hash1, other_hash2, ...)              &rarr; hsh
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        <div class="method-heading">
          <span class="method-callseq">
            update(other_hash1, other_hash2, ...) {|key, oldval, newval| block}
          </span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Adds the contents of the given hashes to the receiver.</p>

<p>If no block is given, entries with duplicate keys are overwritten with the values from each <code>other_hash</code> successively, otherwise the value for each duplicate key is determined by calling the block with the key, its value in the receiver and its value in each <code>other_hash</code>.</p>

<pre class="ruby"><span class="ruby-identifier">h1</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h1</span>.<span class="ruby-identifier">merge!</span>          <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200}</span>
<span class="ruby-identifier">h1</span>                 <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200}</span>

<span class="ruby-identifier">h1</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h2</span> = { <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">246</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span> }
<span class="ruby-identifier">h1</span>.<span class="ruby-identifier">merge!</span>(<span class="ruby-identifier">h2</span>)      <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;246, &quot;c&quot;=&gt;300}</span>
<span class="ruby-identifier">h1</span>                 <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;246, &quot;c&quot;=&gt;300}</span>

<span class="ruby-identifier">h1</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h2</span> = { <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">246</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span> }
<span class="ruby-identifier">h3</span> = { <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">357</span>, <span class="ruby-string">&quot;d&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">400</span> }
<span class="ruby-identifier">h1</span>.<span class="ruby-identifier">merge!</span>(<span class="ruby-identifier">h2</span>, <span class="ruby-identifier">h3</span>)
                   <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;357, &quot;c&quot;=&gt;300, &quot;d&quot;=&gt;400}</span>
<span class="ruby-identifier">h1</span>                 <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;357, &quot;c&quot;=&gt;300, &quot;d&quot;=&gt;400}</span>

<span class="ruby-identifier">h1</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h2</span> = { <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">246</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span> }
<span class="ruby-identifier">h3</span> = { <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">357</span>, <span class="ruby-string">&quot;d&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">400</span> }
<span class="ruby-identifier">h1</span>.<span class="ruby-identifier">merge!</span>(<span class="ruby-identifier">h2</span>, <span class="ruby-identifier">h3</span>) {<span class="ruby-operator">|</span><span class="ruby-identifier">key</span>, <span class="ruby-identifier">v1</span>, <span class="ruby-identifier">v2</span><span class="ruby-operator">|</span> <span class="ruby-identifier">v1</span> }
                   <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200, &quot;c&quot;=&gt;300, &quot;d&quot;=&gt;400}</span>
<span class="ruby-identifier">h1</span>                 <span class="ruby-comment">#=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200, &quot;c&quot;=&gt;300, &quot;d&quot;=&gt;400}</span>
</pre>

<p><a href="Hash.html#method-i-update"><code>Hash#update</code></a> is an alias for <a href="Hash.html#method-i-merge-21"><code>Hash#merge!</code></a>.</p>
          
          

          
          <div class="method-source-code" id="update-source">
            <pre>static VALUE
rb_hash_update(int argc, VALUE *argv, VALUE self)
{
    int i;
    bool block_given = rb_block_given_p();

    rb_hash_modify(self);
    for (i = 0; i &lt; argc; i++){
       VALUE hash = to_hash(argv[i]);
       if (block_given) {
           rb_hash_foreach(hash, rb_hash_update_block_i, self);
       }
       else {
           rb_hash_foreach(hash, rb_hash_update_i, self);
       }
    }
    return self;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-value-3F" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            value?(value)        &rarr; true or false
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns <code>true</code> if the given value is present for some key in <em>hsh</em>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">value?</span>(<span class="ruby-value">100</span>)   <span class="ruby-comment">#=&gt; true</span>
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">value?</span>(<span class="ruby-value">999</span>)   <span class="ruby-comment">#=&gt; false</span>
</pre>
          
          

          
          <div class="method-source-code" id="value-3F-source">
            <pre>static VALUE
rb_hash_has_value(VALUE hash, VALUE val)
{
    VALUE data[2];

    data[0] = Qfalse;
    data[1] = val;
    rb_hash_foreach(hash, rb_hash_search_value, (VALUE)data);
    return data[0];
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-values" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            values    &rarr; array
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Returns a new array populated with the values from <em>hsh</em>. See also <a href="Hash.html#method-i-keys"><code>Hash#keys</code></a>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;a&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">100</span>, <span class="ruby-string">&quot;b&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">200</span>, <span class="ruby-string">&quot;c&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-value">300</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">values</span>   <span class="ruby-comment">#=&gt; [100, 200, 300]</span>
</pre>
          
          

          
          <div class="method-source-code" id="values-source">
            <pre>VALUE
rb_hash_values(VALUE hash)
{
    VALUE values;
    st_index_t size = RHASH_SIZE(hash);

    values = rb_ary_new_capa(size);
    if (size == 0) return values;

    if (ST_DATA_COMPATIBLE_P(VALUE)) {
        if (RHASH_AR_TABLE_P(hash)) {
            rb_gc_writebarrier_remember(values);
            RARRAY_PTR_USE_TRANSIENT(values, ptr, {
                size = ar_values(hash, ptr, size);
            });
        }
        else if (RHASH_ST_TABLE_P(hash)) {
            st_table *table = RHASH_ST_TABLE(hash);
            rb_gc_writebarrier_remember(values);
            RARRAY_PTR_USE_TRANSIENT(values, ptr, {
                size = st_values(table, ptr, size);
            });
        }
        rb_ary_set_len(values, size);
    }
    else {
        rb_hash_foreach(hash, values_i, values);
    }

    return values;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
      <div id="method-i-values_at" class="method-detail ">
        
        
        <div class="method-heading">
          <span class="method-callseq">
            values_at(key, ...)   &rarr; array
          </span>
          
          <span class="method-click-advice">click to toggle source</span>
          
        </div>
        
        

        <div class="method-description">
          
          <p>Return an array containing the values associated with the given keys. Also see <a href="Hash.html#method-i-select"><code>Hash.select</code></a>.</p>

<pre class="ruby"><span class="ruby-identifier">h</span> = { <span class="ruby-string">&quot;cat&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;feline&quot;</span>, <span class="ruby-string">&quot;dog&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;canine&quot;</span>, <span class="ruby-string">&quot;cow&quot;</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-string">&quot;bovine&quot;</span> }
<span class="ruby-identifier">h</span>.<span class="ruby-identifier">values_at</span>(<span class="ruby-string">&quot;cow&quot;</span>, <span class="ruby-string">&quot;cat&quot;</span>)  <span class="ruby-comment">#=&gt; [&quot;bovine&quot;, &quot;feline&quot;]</span>
</pre>
          
          

          
          <div class="method-source-code" id="values_at-source">
            <pre>VALUE
rb_hash_values_at(int argc, VALUE *argv, VALUE hash)
{
    VALUE result = rb_ary_new2(argc);
    long i;

    for (i=0; i&lt;argc; i++) {
        rb_ary_push(result, rb_hash_aref(hash, argv[i]));
    }
    return result;
}</pre>
          </div>
          
        </div>

        

        
      </div>

    
    </section>
  
  </section>

</main>


<footer id="validator-badges" role="contentinfo">
  <p><a href="https://validator.w3.org/check/referer">Validate</a>
  <p>Generated by <a href="https://ruby.github.io/rdoc/">RDoc</a> 6.2.1.1.
  <p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
</footer>