class

Hash(K, V)

Inherits Iterable / Enumerable / Reference / Object

A Hash represents a collection of key-value mappings, similar to a dictionary.

Main operations are storing a key-value mapping (#[]=) and querying the value associated to a key (#[]). Key-value mappings can also be deleted (#delete). Keys are unique within a hash. When adding a key-value mapping with a key that is already in use, the old value will be forgotten.

# Create a new Hash for mapping String to Int32
hash = Hash(String, Int32).new
hash["one"] = 1
hash["two"] = 2
hash["one"] # => 1

Hash literals can also be used to create a Hash:

{"one" => 1, "two" => 2}

Implementation is based on an open hash table. Two objects refer to the same hash key when their hash value (Object#hash) is identical and both objects are equal to each other (Object#==).

Enumeration follows the order that the corresponding keys were inserted.

NOTE: When using mutable data types as keys, changing the value of a key after it was inserted into the Hash may lead to undefined behaviour. This can be restored by re-indexing the hash with #rehash.

Constructors

new(default_value : V, initial_capacity = nil)

Creates a new empty Hash where the default_value is returned if a key is missing.

inventory = Hash(String, Int32).new(0)
inventory["socks"] = 3
inventory["pickles"] # => 0

WARNING: When the default value gets returned on a missing key, it is not stored into the hash under that key. If you want that behaviour, please use the overload with a block.

WARNING: The default value is returned as-is. It gets neither duplicated nor cloned. For types with reference semantics this means it will be exactly the same object every time.

hash = Hash(String, Array(Int32)).new([1])
hash["a"][0] = 2
hash["b"] # => [2]
  • .new(&block : (Hash(K, V), K -> V)) is an alternative with a block that can return a different default value for each invocation.

The initial_capacity is useful to avoid unnecessary reallocations of the internal buffer in case of growth. If the number of elements a hash will hold is known, the hash should be initialized with that capacity for improved performance. Otherwise, the default is 8. Inputs lower than 8 are ignored.

Source
new(pull : JSON::PullParser)

Reads a Hash from the given pull parser.

Keys are read by invoking from_json_object_key? on this hash's key type (K), which must return a value of type K or nil. If nil is returned a JSON::ParseException is raised.

Values are parsed using the regular new(pull : JSON::PullParser) method.

Source
new

Creates a new empty Hash.

Source
new(block : Hash(K, V), K -> V | Nil = nil, *, initial_capacity = nil)

Creates a new empty Hash with a block for handling missing keys.

proc = ->(hash : Hash(String, Int32), key : String) { hash[key] = key.size }
hash = Hash(String, Int32).new(proc)

hash.size   # => 0
hash["foo"] # => 3
hash.size   # => 1
hash["bar"] = 10
hash["bar"] # => 10

The initial_capacity is useful to avoid unnecessary reallocations of the internal buffer in case of growth. If the number of elements a hash will hold is known, the hash should be initialized with that capacity for improved performance. Otherwise, the default is 8. Inputs lower than 8 are ignored.

Source
new(initial_capacity = nil, &block : Hash(K, V), K -> V)

Creates a new empty Hash with a block that handles missing keys.

hash = Hash(String, String).new do |hash, key|
  "some default value"
end

hash.size           # => 0
hash["foo"] = "bar" # => "bar"
hash.size           # => 1
hash["baz"]         # => "some default value"
hash.size           # => 1
hash                # => {"foo" => "bar"}

WARNING: When the default block is invoked on a missing key, its return value is not implicitly stored into the hash under that key. If you want that behaviour, you need to store it explicitly:

hash = Hash(String, Int32).new do |hash, key|
  hash[key] = key.size
end

hash.size   # => 0
hash["foo"] # => 3
hash.size   # => 1
hash["bar"] = 10
hash["bar"] # => 10

The initial_capacity is useful to avoid unnecessary reallocations of the internal buffer in case of growth. If the number of elements a hash will hold is known, the hash should be initialized with that capacity for improved performance. Otherwise, the default is 8. Inputs lower than 8 are ignored.

Source

Class methods

zip(ary1 : Array(K), ary2 : Array(V))

Zips two arrays into a Hash, taking keys from ary1 and values from ary2.

Hash.zip(["key1", "key2", "key3"], ["value1", "value2", "value3"])
# => {"key1" => "value1", "key2" => "value2", "key3" => "value3"}
Source

Instance methods

==(other : Hash) : Bool

Compares with other. Returns true if all key-value pairs are the same.

Source
==(other : JSON::Any)
Source
==(other : YAML::Any)
Source
[](key)

Returns the value for the key given by key. If not found, returns the default value given by Hash.new, otherwise raises KeyError.

h = {"foo" => "bar"}
h["foo"] # => "bar"

h = Hash(String, String).new("bar")
h["foo"] # => "bar"

h = Hash(String, String).new { "bar" }
h["foo"] # => "bar"

h = Hash(String, String).new
h["foo"] # raises KeyError
Source
[]=(key : K, value : V) : V

Sets the value of key to the given value.

h = {} of String => String
h["foo"] = "bar"
h["foo"] # => "bar"
Source
[]?(key)

Returns the value for the key given by key. If not found, returns nil. This ignores the default value set by Hash.new.

h = {"foo" => "bar"}
h["foo"]? # => "bar"
h["bar"]? # => nil

h = Hash(String, String).new("bar")
h["foo"]? # => nil
Source
clear

Empties a Hash and returns it.

hash = {"foo" => "bar"}
hash.clear # => {}
Source
clone

Similar to #dup, but duplicates the values as well.

hash_a = {"foobar" => {"foo" => "bar"}}
hash_b = hash_a.clone
hash_b["foobar"]["foo"] = "baz"
hash_a # => {"foobar" => {"foo" => "bar"}}
Source
compact

Returns new Hash without nil values.

hash = {"hello" => "world", "foo" => nil}
hash.compact # => {"hello" => "world"}
Source
compact!

Removes all nil value from self. Returns self.

hash = {"hello" => "world", "foo" => nil}
hash.compact! # => {"hello" => "world"}
Source
compare_by_identity

Makes this hash compare keys using their object identity (object_id) for types that define such method (Reference types, but also structs that might wrap other Reference types and delegate the object_id method to them).

h1 = {"foo" => 1, "bar" => 2}
h1["fo" + "o"]? # => 1

h1.compare_by_identity
h1.compare_by_identity? # => true
h1["fo" + "o"]?         # => nil # not the same String instance
Source
compare_by_identity?

Returns true if this Hash is comparing keys by object_id.

See compare_by_identity.

Source
delete(key) : V | Nil

Deletes the key-value pair and returns the value, otherwise returns nil.

h = {"foo" => "bar"}
h.delete("foo")     # => "bar"
h.fetch("foo", nil) # => nil
Source
delete(key, &)

Deletes the key-value pair and returns the value, else yields key with given block.

h = {"foo" => "bar"}
h.delete("foo") { |key| "#{key} not found" } # => "bar"
h.fetch("foo", nil)                          # => nil
h.delete("baz") { |key| "#{key} not found" } # => "baz not found"
Source
dig(key : K, *subkeys)

Traverses the depth of a structure and returns the value, otherwise raises KeyError.

h = {"a" => {"b" => [10, 20, 30]}}
h.dig "a", "b" # => [10, 20, 30]
h.dig "a", "x" # raises KeyError
Source
dig?(key : K, *subkeys)

Traverses the depth of a structure and returns the value. Returns nil if not found.

h = {"a" => {"b" => [10, 20, 30]}}
h.dig? "a", "b" # => [10, 20, 30]
h.dig? "a", "x" # => nil
Source
dup

Duplicates a Hash.

hash_a = {"foo" => "bar"}
hash_b = hash_a.dup
hash_b.merge!({"baz" => "qux"})
hash_a # => {"foo" => "bar"}
Source
each

Calls the given block for each key-value pair and passes in the key and the value.

h = {"foo" => "bar"}

h.each do |key, value|
  key   # => "foo"
  value # => "bar"
end

h.each do |key_and_value|
  key_and_value # => {"foo", "bar"}
end

The enumeration follows the order the keys were inserted.

Source
each

Returns an iterator over the hash entries. Which behaves like an Iterator returning a Tuple consisting of the key and value types.

hsh = {"foo" => "bar", "baz" => "qux"}
iterator = hsh.each

iterator.next # => {"foo", "bar"}
iterator.next # => {"baz", "qux"}

The enumeration follows the order the keys were inserted.

Source
each_key

Calls the given block for each key-value pair and passes in the key.

h = {"foo" => "bar"}
h.each_key do |key|
  key # => "foo"
end

The enumeration follows the order the keys were inserted.

Source
each_key

Returns an iterator over the hash keys. Which behaves like an Iterator consisting of the key's types.

hsh = {"foo" => "bar", "baz" => "qux"}
iterator = hsh.each_key

key = iterator.next
key # => "foo"

key = iterator.next
key # => "baz"

The enumeration follows the order the keys were inserted.

Source
each_value

Calls the given block for each key-value pair and passes in the value.

h = {"foo" => "bar"}
h.each_value do |value|
  value # => "bar"
end

The enumeration follows the order the keys were inserted.

Source
each_value

Returns an iterator over the hash values. Which behaves like an Iterator consisting of the value's types.

hsh = {"foo" => "bar", "baz" => "qux"}
iterator = hsh.each_value

value = iterator.next
value # => "bar"

value = iterator.next
value # => "qux"

The enumeration follows the order the keys were inserted.

Source
empty?

Returns true when hash contains no key-value pairs.

h = Hash(String, String).new
h.empty? # => true

h = {"foo" => "bar"}
h.empty? # => false
Source
fetch(key, default)

Returns the value for the key given by key, or when not found the value given by default. This ignores the default value set by Hash.new.

h = {"foo" => "bar"}
h.fetch("foo", "foo") # => "bar"
h.fetch("bar", "foo") # => "foo"
Source
fetch(key, &)

Returns the value for the key given by key, or when not found calls the given block with the key.

h = {"foo" => "bar"}
h.fetch("foo") { "default value" }  # => "bar"
h.fetch("bar") { "default value" }  # => "default value"
h.fetch("bar") { |key| key.upcase } # => "BAR"
Source
first_key

Returns the first key in the hash.

Source
first_key?

Returns the first key if it exists, or returns nil.

hash = {"foo1" => "bar1", "foz2" => "baz2"}
hash.first_key? # => "foo1"
hash.clear
hash.first_key? # => nil
Source
first_value

Returns the first value in the hash.

Source
first_value?

Returns the first value if it exists, or returns nil.

hash = {"foo1" => "bar1", "foz2" => "baz2"}
hash.first_value? # => "bar1"
hash.clear
hash.first_value? # => nil
Source
has_key?(key) : Bool

Returns true when key given by key exists, otherwise false.

h = {"foo" => "bar"}
h.has_key?("foo") # => true
h.has_key?("bar") # => false
Source
has_value?(val) : Bool

Returns true when value given by value exists, otherwise false.

h = {"foo" => "bar"}
h.has_value?("foo") # => false
h.has_value?("bar") # => true
Source
hash(hasher)

See Object#hash(hasher)

Source
inspect(io : IO) : Nil

Appends a String representation of this object which includes its class name, its object address and the values of all instance variables.

class Person
  def initialize(@name : String, @age : Int32)
  end
end

Person.new("John", 32).inspect # => #<Person:0x10fd31f20 @name="John", @age=32>
Source
invert

Inverts keys and values. If there are duplicated values, the last key becomes the new value.

{"foo" => "bar"}.invert                 # => {"bar" => "foo"}
{"foo" => "bar", "baz" => "bar"}.invert # => {"bar" => "baz"}
Source
key_for(value) : K

Returns a key with the given value, else raises KeyError.

hash = {"foo" => "bar", "baz" => "qux"}
hash.key_for("bar")    # => "foo"
hash.key_for("qux")    # => "baz"
hash.key_for("foobar") # raises KeyError (Missing hash key for value: foobar)
Source
key_for(value, &)

Returns a key with the given value, else yields value with the given block.

hash = {"foo" => "bar"}
hash.key_for("bar") { |value| value.upcase } # => "foo"
hash.key_for("qux") { |value| value.upcase } # => "QUX"
Source
key_for?(value) : K | Nil

Returns a key with the given value, else nil.

hash = {"foo" => "bar", "baz" => "qux"}
hash.key_for?("bar")    # => "foo"
hash.key_for?("qux")    # => "baz"
hash.key_for?("foobar") # => nil
Source
keys

Returns a new Array with all the keys.

h = {"foo" => "bar", "baz" => "bar"}
h.keys # => ["foo", "baz"]
Source
last_key

Returns the last key in the hash.

Source
last_key?

Returns the last key if it exists, or returns nil.

hash = {"foo1" => "bar1", "foz2" => "baz2"}
hash.last_key? # => "foz2"
hash.clear
hash.last_key? # => nil
Source
last_value

Returns the last value in the hash.

Source
last_value?

Returns the last value if it exists, or returns nil.

hash = {"foo1" => "bar1", "foz2" => "baz2"}
hash.last_value? # => "baz2"
hash.clear
hash.last_value? # => nil
Source
merge(other : Hash(L, W)) : Hash(K | L, V | W) forall L, W

Returns a new Hash with the keys and values of this hash and other combined. A value in other takes precedence over the one in this hash.

hash = {"foo" => "bar"}
hash.merge({"baz" => "qux"})
# => {"foo" => "bar", "baz" => "qux"}
hash
# => {"foo" => "bar"}
Source
merge(other : Hash(L, W), & : L, V, W -> V | W) : Hash(K | L, V | W) forall L, W
Source
merge!(other : Hash) : self

Similar to #merge, but the receiver is modified.

hash = {"foo" => "bar"}
hash.merge!({"baz" => "qux"})
hash # => {"foo" => "bar", "baz" => "qux"}
Source
merge!(other : Hash, &) : self

Adds the contents of other to this hash. If a key exists in both hashes, the given block is called to determine the value to be used. The block arguments are the key, the value in self and the value in other.

hash = {"a" => 100, "b" => 200}
other = {"b" => 254, "c" => 300}
hash.merge!(other) { |key, v1, v2| v1 + v2 }
hash # => {"a" => 100, "b" => 454, "c" => 300}
Source
pretty_print(pp) : Nil
Source
proper_subset_of?(other : Hash) : Bool

Returns true if self is a subset of other.

Source
proper_superset_of?(other : Hash) : Bool

Returns true if other is a subset of self or equals to self.

Source
put(key : K, value : V, &)

Sets the value of key to the given value.

If a value already exists for key, that (old) value is returned. Otherwise the given block is invoked with key and its value is returned.

h = {} of Int32 => String
h.put(1, "one") { "didn't exist" } # => "didn't exist"
h.put(1, "uno") { "didn't exist" } # => "one"
h.put(2, "two") { |key| key.to_s } # => "2"
h                                  # => {1 => "one", 2 => "two"}
Source
put_if_absent(key : K, value : V) : V

Sets the value of key to the given value, unless a value for key already exists.

If a value already exists for key, that (old) value is returned. Otherwise value is returned.

h = {} of Int32 => String
h.put_if_absent(1, "one") # => "one"
h.put_if_absent(1, "uno") # => "one"
h.put_if_absent(2, "two") # => "two"
h                         # => {1 => "one", 2 => "two"}
Source
put_if_absent(key : K, & : K -> V) : V

Sets the value of key to the value returned by the given block, unless a value for key already exists.

If a value already exists for key, that (old) value is returned. Otherwise the given block is invoked with key and its value is returned.

h = {} of Int32 => Array(String)
h.put_if_absent(1) { |key| [key.to_s] } # => ["1"]
h.put_if_absent(1) { [] of String }     # => ["1"]
h.put_if_absent(2) { |key| [key.to_s] } # => ["2"]
h                                       # => {1 => ["1"], 2 => ["2"]}

hash.put_if_absent(key) { value } is a more performant alternative to hash[key] ||= value that also works correctly when the hash may contain falsey values.

Source
rehash

Rebuilds the hash table based on the current keys.

When using mutable data types as keys, modifying a key after it was inserted into the Hash may lead to undefined behaviour. This method re-indexes the hash using the current keys.

Source
reject

Returns a new hash consisting of entries for which the block is falsey.

h = {"a" => 100, "b" => 200, "c" => 300}
h.reject { |k, v| k > "a" } # => {"a" => 100}
h.reject { |k, v| v < 200 } # => {"b" => 200, "c" => 300}
Source
reject(keys : Enumerable) : Hash(K, V)

Returns a new Hash without the given keys.

{"a" => 1, "b" => 2, "c" => 3, "d" => 4}.reject(["a", "c"]) # => {"b" => 2, "d" => 4}
Source
reject(*keys) : Hash(K, V)

Returns a new Hash without the given keys.

{"a" => 1, "b" => 2, "c" => 3, "d" => 4}.reject("a", "c") # => {"b" => 2, "d" => 4}
Source
reject!

Equivalent to Hash#reject, but makes modification on the current object rather than returning a new one. Returns self.

Source
reject!(keys : Enumerable) : self

Removes a list of keys out of hash.

hash = {"a" => 1, "b" => 2, "c" => 3, "d" => 4}
hash.reject!(["a", "c"]) # => {"b" => 2, "d" => 4}
hash                     # => {"b" => 2, "d" => 4}
Source
reject!(*keys) : self

Removes a list of keys out of hash.

hash = {"a" => 1, "b" => 2, "c" => 3, "d" => 4}
hash.reject!("a", "c") # => {"b" => 2, "d" => 4}
hash                   # => {"b" => 2, "d" => 4}
Source
select

Returns a new hash consisting of entries for which the block is truthy.

h = {"a" => 100, "b" => 200, "c" => 300}
h.select { |k, v| k > "a" } # => {"b" => 200, "c" => 300}
h.select { |k, v| v < 200 } # => {"a" => 100}
Source
select(keys : Enumerable) : Hash(K, V)

Returns a new Hash with the given keys.

{"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select({"a", "c"})    # => {"a" => 1, "c" => 3}
{"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select("a", "c")      # => {"a" => 1, "c" => 3}
{"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select(["a", "c"])    # => {"a" => 1, "c" => 3}
{"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select(Set{"a", "c"}) # => {"a" => 1, "c" => 3}
Source
select(*keys) : Hash(K, V)

Returns a new Hash with the given keys.

{"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select({"a", "c"})    # => {"a" => 1, "c" => 3}
{"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select("a", "c")      # => {"a" => 1, "c" => 3}
{"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select(["a", "c"])    # => {"a" => 1, "c" => 3}
{"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select(Set{"a", "c"}) # => {"a" => 1, "c" => 3}
Source
select!

Equivalent to Hash#select but makes modification on the current object rather than returning a new one. Returns self.

Source
select!(keys : Indexable) : self

Removes every element except the given ones.

h1 = {"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select!({"a", "c"})
h2 = {"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select!("a", "c")
h3 = {"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select!(["a", "c"])
h4 = {"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select!(Set{"a", "c"})
h1 == h2 == h3 == h4 # => true
h1                   # => {"a" => 1, "c" => 3}
Source
select!(keys : Enumerable) : self

Removes every element except the given ones.

h1 = {"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select!({"a", "c"})
h2 = {"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select!("a", "c")
h3 = {"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select!(["a", "c"])
h4 = {"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select!(Set{"a", "c"})
h1 == h2 == h3 == h4 # => true
h1                   # => {"a" => 1, "c" => 3}
Source
select!(*keys) : self

Removes every element except the given ones.

h1 = {"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select!({"a", "c"})
h2 = {"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select!("a", "c")
h3 = {"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select!(["a", "c"])
h4 = {"a" => 1, "b" => 2, "c" => 3, "d" => 4}.select!(Set{"a", "c"})
h1 == h2 == h3 == h4 # => true
h1                   # => {"a" => 1, "c" => 3}
Source
shift

Deletes and returns the first key-value pair in the hash, or raises IndexError if the hash is empty.

hash = {"foo" => "bar", "baz" => "qux"}
hash.shift # => {"foo", "bar"}
hash       # => {"baz" => "qux"}

hash = {} of String => String
hash.shift # raises IndexError
Source
shift

Deletes and returns the first key-value pair in the hash. Yields to the given block if the hash is empty.

hash = {"foo" => "bar", "baz" => "qux"}
hash.shift { true } # => {"foo", "bar"}
hash                # => {"baz" => "qux"}

hash = {} of String => String
hash.shift { true } # => true
hash                # => {}
Source
shift?

Same as #shift, but returns nil if the hash is empty.

hash = {"foo" => "bar", "baz" => "qux"}
hash.shift? # => {"foo", "bar"}
hash        # => {"baz" => "qux"}

hash = {} of String => String
hash.shift? # => nil
Source
size

Returns the number of elements in this Hash.

Source
subset_of?(other : Hash) : Bool

Returns true if self is a subset of other or equals to other.

Source
superset_of?(other : Hash) : Bool

Returns true if other is a subset of self.

Source
to_a

Returns an Array of Tuple(K, V) with key and values belonging to this Hash.

h = {1 => 'a', 2 => 'b', 3 => 'c'}
h.to_a # => [{1, 'a'}, {2, 'b'}, {3, 'c'}]

The order of the array follows the order the keys were inserted in the Hash.

Source
to_a

Returns an Array with the results of running block against tuples with key and values belonging to this Hash.

h = {"first_name" => "foo", "last_name" => "bar"}
h.to_a { |_k, v| v.capitalize } # => ["Foo", "Bar"]

The order of the array follows the order the keys were inserted in the Hash.

Source
to_h

Returns self.

Source
to_json(json : JSON::Builder) : Nil

Serializes this Hash into JSON.

Keys are serialized by invoking to_json_object_key on them. Values are serialized with the usual to_json(json : JSON::Builder) method.

Source
to_s(io : IO) : Nil

Converts to a String.

h = {"foo" => "bar"}
h.to_s       # => "{\"foo\" => \"bar\"}"
h.to_s.class # => String
Source
to_yaml(yaml : YAML::Nodes::Builder) : Nil
Source
transform_keys

Returns a new hash with all keys converted using the block operation. The block can change a type of keys. The block yields the key and value.

hash = {:a => 1, :b => 2, :c => 3}
hash.transform_keys { |key| key.to_s }                # => {"a" => 1, "b" => 2, "c" => 3}
hash.transform_keys { |key, value| key.to_s * value } # => {"a" => 1, "bb" => 2, "ccc" => 3}
Source
transform_keys!

Destructively transforms all keys using a block. Same as transform_keys but modifies in place. The block cannot change a type of keys. The block yields the key and value.

hash = {"a" => 1, "b" => 2, "c" => 3}
hash.transform_keys! { |key| key.upcase }
hash # => {"A" => 1, "B" => 2, "C" => 3}
hash.transform_keys! { |key, value| key * value }
hash # => {"a" => 1, "bb" => 2, "ccc" => 3}
Source
transform_values

Returns a new hash with the results of running block once for every value. The block can change a type of values. The block yields the value and key.

hash = {:a => 1, :b => 2, :c => 3}
hash.transform_values { |value| value + 1 }             # => {:a => 2, :b => 3, :c => 4}
hash.transform_values { |value, key| "#{key}#{value}" } # => {:a => "a1", :b => "b2", :c => "c3"}
Source
transform_values!

Destructively transforms all values using a block. Same as transform_values but modifies in place. The block cannot change a type of values. The block yields the value and key.

hash = {:a => 1, :b => 2, :c => 3}
hash.transform_values! { |value| value + 1 }
hash # => {:a => 2, :b => 3, :c => 4}
hash.transform_values! { |value, key| value + key.to_s[0].ord }
hash # => {:a => 99, :b => 101, :c => 103}

See #update for updating a single value.

Source
update(key : K, & : V -> V) : V

Updates the current value of key with the value returned by the given block (the current value is used as input for the block).

If no entry for key is present, but there's a default value (or default block) then that default value is used as input for the given block.

If no entry for key is present and the hash has no default value, it raises KeyError.

It returns the value used as input for the given block (ie. the old value if key present, or the default value)

h = {"a" => 0, "b" => 1}
h.update("b") { |v| v + 41 } # => 1
h["b"]                       # => 42

h = Hash(String, Int32).new(40)
h.update("foo") { |v| v + 2 } # => 40
h["foo"]                      # => 42

h = {} of String => Int32
h.update("a") { 42 } # raises KeyError

See #transform_values! for updating all the values.

Source
values

Returns only the values as an Array.

h = {"foo" => "bar", "baz" => "qux"}
h.values # => ["bar", "qux"]
Source
values_at(*keys : K)

Returns a tuple populated with the values of the given keys, with the same order. Raises if a key is not found.

{"a" => 1, "b" => 2, "c" => 3, "d" => 4}.values_at("a", "c") # => {1, 3}
Source