This is a Ruby tree! It shows every object from the Ruby Programming Language in a tree format.

Hash

        # Hash < Object

---
# Includes:
Enumerable (from ruby core)

(from ruby core)
---
A Hash maps each of its unique keys to a specific value.

A Hash has certain similarities to an Array, but:
*   An Array index is always an Integer.
*   A Hash key can be (almost) any object.


### Hash Data Syntax

The older syntax for Hash data uses the "hash rocket," `=>`:

    h = {:foo => 0, :bar => 1, :baz => 2}
    h # => {:foo=>0, :bar=>1, :baz=>2}

Alternatively, but only for a Hash key that's a Symbol, you can use a
newer JSON-style syntax, where each bareword becomes a Symbol:

    h = {foo: 0, bar: 1, baz: 2}
    h # => {:foo=>0, :bar=>1, :baz=>2}

You can also use a String in place of a bareword:

    h = {'foo': 0, 'bar': 1, 'baz': 2}
    h # => {:foo=>0, :bar=>1, :baz=>2}

And you can mix the styles:

    h = {foo: 0, :bar => 1, 'baz': 2}
    h # => {:foo=>0, :bar=>1, :baz=>2}

But it's an error to try the JSON-style syntax for a key that's not a
bareword or a String:

    # Raises SyntaxError (syntax error, unexpected ':', expecting =>):
    h = {0: 'zero'}

Hash value can be omitted, meaning that value will be fetched from the
context by the name of the key:

    x = 0
    y = 100
    h = {x:, y:}
    h # => {:x=>0, :y=>100}

### Common Uses

You can use a Hash to give names to objects:

    person = {name: 'Matz', language: 'Ruby'}
    person # => {:name=>"Matz", :language=>"Ruby"}

You can use a Hash to give names to method arguments:

    def some_method(hash)
      p hash
    end
    some_method({foo: 0, bar: 1, baz: 2}) # => {:foo=>0, :bar=>1, :baz=>2}

Note: when the last argument in a method call is a Hash, the curly
braces may be omitted:

    some_method(foo: 0, bar: 1, baz: 2) # => {:foo=>0, :bar=>1, :baz=>2}

You can use a Hash to initialize an object:

    class Dev
      attr_accessor :name, :language
      def initialize(hash)
        self.name = hash[:name]
        self.language = hash[:language]
      end
    end
    matz = Dev.new(name: 'Matz', language: 'Ruby')
    matz # => #<Dev: @name="Matz", @language="Ruby">

### Creating a Hash

You can create a Hash object explicitly with:

*   A [hash literal](doc/syntax/literals_rdoc.html#label-Hash+Literals).


You can convert certain objects to Hashes with:

*   Method [Hash](Kernel.html#method-i-Hash).


You can create a Hash by calling method Hash.new.

Create an empty Hash:

    h = Hash.new
    h # => {}
    h.class # => Hash

You can create a Hash by calling method Hash.[].

Create an empty Hash:

    h = Hash[]
    h # => {}

Create a Hash with initial entries:

    h = Hash[foo: 0, bar: 1, baz: 2]
    h # => {:foo=>0, :bar=>1, :baz=>2}

You can create a Hash by using its literal form (curly braces).

Create an empty Hash:

    h = {}
    h # => {}

Create a Hash with initial entries:

    h = {foo: 0, bar: 1, baz: 2}
    h # => {:foo=>0, :bar=>1, :baz=>2}

### Hash Value Basics

The simplest way to retrieve a Hash value (instance method #[]):

    h = {foo: 0, bar: 1, baz: 2}
    h[:foo] # => 0

The simplest way to create or update a Hash value (instance method
#[]=):

    h = {foo: 0, bar: 1, baz: 2}
    h[:bat] = 3 # => 3
    h # => {:foo=>0, :bar=>1, :baz=>2, :bat=>3}
    h[:foo] = 4 # => 4
    h # => {:foo=>4, :bar=>1, :baz=>2, :bat=>3}

The simplest way to delete a Hash entry (instance method #delete):

    h = {foo: 0, bar: 1, baz: 2}
    h.delete(:bar) # => 1
    h # => {:foo=>0, :baz=>2}

### Entry Order

A Hash object presents its entries in the order of their creation. This
is seen in:

*   Iterative methods such as `each`, `each_key`, `each_pair`,
    `each_value`.
*   Other order-sensitive methods such as `shift`, `keys`, `values`.
*   The String returned by method `inspect`.


A new Hash has its initial ordering per the given entries:

    h = Hash[foo: 0, bar: 1]
    h # => {:foo=>0, :bar=>1}

New entries are added at the end:

    h[:baz] = 2
    h # => {:foo=>0, :bar=>1, :baz=>2}

Updating a value does not affect the order:

    h[:baz] = 3
    h # => {:foo=>0, :bar=>1, :baz=>3}

But re-creating a deleted entry can affect the order:

    h.delete(:foo)
    h[:foo] = 5
    h # => {:bar=>1, :baz=>3, :foo=>5}

### Hash Keys

#### Hash Key Equivalence

Two objects are treated as the same hash key when their `hash` value is
identical and the two objects are `eql?` to each other.

#### Modifying an Active Hash Key

Modifying a Hash key while it is in use damages the hash's index.

This Hash has keys that are Arrays:

    a0 = [ :foo, :bar ]
    a1 = [ :baz, :bat ]
    h = {a0 => 0, a1 => 1}
    h.include?(a0) # => true
    h[a0] # => 0
    a0.hash # => 110002110

Modifying array element `a0[0]` changes its hash value:

    a0[0] = :bam
    a0.hash # => 1069447059

And damages the Hash index:

    h.include?(a0) # => false
    h[a0] # => nil

You can repair the hash index using method `rehash`:

    h.rehash # => {[:bam, :bar]=>0, [:baz, :bat]=>1}
    h.include?(a0) # => true
    h[a0] # => 0

A String key is always safe. That's because an unfrozen String passed as
a key will be replaced by a duplicated and frozen String:

    s = 'foo'
    s.frozen? # => false
    h = {s => 0}
    first_key = h.keys.first
    first_key.frozen? # => true

#### User-Defined Hash Keys

To be useable as a Hash key, objects must implement the methods `hash`
and `eql?`. Note: this requirement does not apply if the Hash uses
#compare_by_identity since comparison will then rely on the keys' object
id instead of `hash` and `eql?`.

Object defines basic implementation for `hash` and `eq?` that makes each
object a distinct key. Typically, user-defined classes will want to
override these methods to provide meaningful behavior, or for example
inherit Struct that has useful definitions for these.

A typical implementation of `hash` is based on the object's data while
`eql?` is usually aliased to the overridden `==` method:

    class Book
      attr_reader :author, :title

      def initialize(author, title)
        @author = author
        @title = title
      end

      def ==(other)
        self.class === other &&
          other.author == @author &&
          other.title == @title
      end

      alias eql? ==

      def hash
        @author.hash ^ @title.hash # XOR
      end
    end

    book1 = Book.new 'matz', 'Ruby in a Nutshell'
    book2 = Book.new 'matz', 'Ruby in a Nutshell'

    reviews = {}

    reviews[book1] = 'Great reference!'
    reviews[book2] = 'Nice and compact!'

    reviews.length #=> 1

### Default Values

The methods #[], #values_at and #dig need to return the value associated
to a certain key. When that key is not found, that value will be
determined by its default proc (if any) or else its default (initially
`nil`).

You can retrieve the default value with method #default:

    h = Hash.new
    h.default # => nil

You can set the default value by passing an argument to method Hash.new
or with method #default=

    h = Hash.new(-1)
    h.default # => -1
    h.default = 0
    h.default # => 0

This default value is returned for #[], #values_at and #dig when a key
is not found:

    counts = {foo: 42}
    counts.default # => nil (default)
    counts[:foo] = 42
    counts[:bar] # => nil
    counts.default = 0
    counts[:bar] # => 0
    counts.values_at(:foo, :bar, :baz) # => [42, 0, 0]
    counts.dig(:bar) # => 0

Note that the default value is used without being duplicated. It is not
advised to set the default value to a mutable object:

    synonyms = Hash.new([])
    synonyms[:hello] # => []
    synonyms[:hello] << :hi # => [:hi], but this mutates the default!
    synonyms.default # => [:hi]
    synonyms[:world] << :universe
    synonyms[:world] # => [:hi, :universe], oops
    synonyms.keys # => [], oops

To use a mutable object as default, it is recommended to use a default
proc

#### Default Proc

When the default proc for a Hash is set (i.e., not `nil`), the default
value returned by method #[] is determined by the default proc alone.

You can retrieve the default proc with method #default_proc:

    h = Hash.new
    h.default_proc # => nil

You can set the default proc by calling Hash.new with a block or calling
the method #default_proc=

    h = Hash.new { |hash, key| "Default value for #{key}" }
    h.default_proc.class # => Proc
    h.default_proc = proc { |hash, key| "Default value for #{key.inspect}" }
    h.default_proc.class # => Proc

When the default proc is set (i.e., not `nil`) and method #[] is called
with with a non-existent key, #[] calls the default proc with both the
Hash object itself and the missing key, then returns the proc's return
value:

    h = Hash.new { |hash, key| "Default value for #{key}" }
    h[:nosuch] # => "Default value for nosuch"

Note that in the example above no entry for key `:nosuch` is created:

    h.include?(:nosuch) # => false

However, the proc itself can add a new entry:

    synonyms = Hash.new { |hash, key| hash[key] = [] }
    synonyms.include?(:hello) # => false
    synonyms[:hello] << :hi # => [:hi]
    synonyms[:world] << :universe # => [:universe]
    synonyms.keys # => [:hello, :world]

Note that setting the default proc will clear the default value and vice
versa.

### What's Here

First, what's elsewhere. Class Hash:

*   Inherits from [class
    Object](Object.html#class-Object-label-What-27s+Here).
*   Includes [module
    Enumerable](Enumerable.html#module-Enumerable-label-What-27s+Here),
    which provides dozens of additional methods.


Here, class Hash provides methods that are useful for:

*   [Creating a Hash](#class-Hash-label-Methods+for+Creating+a+Hash)
*   [Setting Hash
    State](#class-Hash-label-Methods+for+Setting+Hash+State)
*   [Querying](#class-Hash-label-Methods+for+Querying)
*   [Comparing](#class-Hash-label-Methods+for+Comparing)
*   [Fetching](#class-Hash-label-Methods+for+Fetching)
*   [Assigning](#class-Hash-label-Methods+for+Assigning)
*   [Deleting](#class-Hash-label-Methods+for+Deleting)
*   [Iterating](#class-Hash-label-Methods+for+Iterating)
*   [Converting](#class-Hash-label-Methods+for+Converting)
*   [Transforming Keys and
    Values](#class-Hash-label-Methods+for+Transforming+Keys+and+Values)
*   [And more....](#class-Hash-label-Other+Methods)


Class Hash also includes methods from module Enumerable.

#### Methods for Creating a Hash

::[]
:   Returns a new hash populated with given objects.
::new
:   Returns a new empty hash.
::try_convert
:   Returns a new hash created from a given object.


#### Methods for Setting Hash State

#compare_by_identity
:   Sets `self` to consider only identity in comparing keys.
#default=
:   Sets the default to a given value.
#default_proc=
:   Sets the default proc to a given proc.
#rehash
:   Rebuilds the hash table by recomputing the hash index for each key.


#### Methods for Querying

#any?
:   Returns whether any element satisfies a given criterion.
#compare_by_identity?
:   Returns whether the hash considers only identity when comparing
    keys.
#default
:   Returns the default value, or the default value for a given key.
#default_proc
:   Returns the default proc.
#empty?
:   Returns whether there are no entries.
#eql?
:   Returns whether a given object is equal to `self`.
#hash
:   Returns the integer hash code.
#has_value?
:   Returns whether a given object is a value in `self`.
#include?, #has_key?, #member?, #key?
:   Returns whether a given object is a key in `self`.
#length, #size
:   Returns the count of entries.
#value?
:   Returns whether a given object is a value in `self`.


#### Methods for Comparing

[#<](#method-i-3C)
:   Returns whether `self` is a proper subset of a given object.
[#<=](#method-i-3C-3D)
:   Returns whether `self` is a subset of a given object.
[#==](#method-i-3D-3D)
:   Returns whether a given object is equal to `self`.
[#>](#method-i-3E)
:   Returns whether `self` is a proper superset of a given object
[#>=](#method-i-3E-3D)
:   Returns whether `self` is a proper superset of a given object.


#### Methods for Fetching

#[]
:   Returns the value associated with a given key.
#assoc
:   Returns a 2-element array containing a given key and its value.
#dig
:   Returns the object in nested objects that is specified by a given
    key and additional arguments.
#fetch
:   Returns the value for a given key.
#fetch_values
:   Returns array containing the values associated with given keys.
#key
:   Returns the key for the first-found entry with a given value.
#keys
:   Returns an array containing all keys in `self`.
#rassoc
:   Returns a 2-element array consisting of the key and value of the
    first-found entry having a given value.
#values
:   Returns an array containing all values in `self`/
#values_at
:   Returns an array containing values for given keys.


#### Methods for Assigning

#[]=, #store
:   Associates a given key with a given value.
#merge
:   Returns the hash formed by merging each given hash into a copy of
    `self`.
#merge!, #update
:   Merges each given hash into `self`.
#replace
:   Replaces the entire contents of `self` with the contents of a givan
    hash.


#### Methods for Deleting

These methods remove entries from `self`:

#clear
:   Removes all entries from `self`.
#compact!
:   Removes all `nil`-valued entries from `self`.
#delete
:   Removes the entry for a given key.
#delete_if
:   Removes entries selected by a given block.
#filter!, #select!
:   Keep only those entries selected by a given block.
#keep_if
:   Keep only those entries selected by a given block.
#reject!
:   Removes entries selected by a given block.
#shift
:   Removes and returns the first entry.


These methods return a copy of `self` with some entries removed:

#compact
:   Returns a copy of `self` with all `nil`-valued entries removed.
#except
:   Returns a copy of `self` with entries removed for specified keys.
#filter, #select
:   Returns a copy of `self` with only those entries selected by a given
    block.
#reject
:   Returns a copy of `self` with entries removed as specified by a
    given block.
#slice
:   Returns a hash containing the entries for given keys.


#### Methods for Iterating
#each, #each_pair
:   Calls a given block with each key-value pair.
#each_key
:   Calls a given block with each key.
#each_value
:   Calls a given block with each value.


#### Methods for Converting

#inspect, #to_s
:   Returns a new String containing the hash entries.
#to_a
:   Returns a new array of 2-element arrays; each nested array contains
    a key-value pair from `self`.
#to_h
:   Returns `self` if a Hash; if a subclass of Hash, returns a Hash
    containing the entries from `self`.
#to_hash
:   Returns `self`.
#to_proc
:   Returns a proc that maps a given key to its value.


#### Methods for Transforming Keys and Values

#transform_keys
:   Returns a copy of `self` with modified keys.
#transform_keys!
:   Modifies keys in `self`
#transform_values
:   Returns a copy of `self` with modified values.
#transform_values!
:   Modifies values in `self`.


#### Other Methods
#flatten
:   Returns an array that is a 1-dimensional flattening of `self`.
#invert
:   Returns a hash with the each key-value pair inverted.

---
# Class methods:

    []
    new
    ruby2_keywords_hash
    ruby2_keywords_hash?
    try_convert

# Instance methods:

    <
    <=
    ==
    >
    >=
    []
    []=
    any?
    assoc
    clear
    compact
    compact!
    compare_by_identity
    compare_by_identity?
    deconstruct_keys
    default
    default=
    default_proc
    default_proc=
    delete
    delete_if
    dig
    each
    each_key
    each_pair
    each_value
    empty?
    eql?
    except
    fetch
    fetch_values
    filter
    filter!
    flatten
    has_key?
    has_value?
    hash
    include?
    initialize_copy
    inspect
    invert
    keep_if
    key
    key?
    keys
    length
    member?
    merge
    merge!
    rassoc
    rehash
    reject
    reject!
    replace
    select
    select!
    shift
    size
    slice
    store
    to_a
    to_h
    to_hash
    to_proc
    to_s
    transform_keys
    transform_keys!
    transform_values
    transform_values!
    update
    value?
    values
    values_at


      

This is MURDOC! A Ruby documentation browser inspired by Smalltalk-80. It allows you to learn about Ruby by browsing through its class hierarchies, and see any of its methods.