Hash in Ruby language
A Hash is a collection of key-value pairs data.
These key-value pairs provide a useful way to store and access data.
A Hash is created using symbols as keys and any data types as values.
Hashes are often used to hold data that are related, such as the information about a user.
Creating a Hash with implicit syntax
-
Newest form (introduced in Ruby 1.9)
language = {name: 'Ruby', birth_year: 1995, created_by: 'Matz'} -
Old forms
language = {:name => 'Ruby', :birth_year => 1995, :created_by => 'Matz'}
Note: Do not use space inside of the delimiters for Hash, similar to how we would not use a space inside the delimiters of Array.
-
Using the
newmethodlanguage = Hash.new language[:name] = 'Ruby' language[:birth_year] = 1995 language[:created_by] = 'Matz' puts language # {:name=>"Ruby", :birth_year=>1995, :created_by=>"Matz"}If you pass argument to
new, it will create a Hash with default value. It means if the value doesn’t exist for any key then this default value will be returned.language = Hash.new("C") language[:birth_year] = 1995 language[:created_by] = 'Matz' puts language # {:birth_year=>1995, :created_by=>"Matz"} # Notice below puts language[:lang] # C puts language[:some_key_that_does_not_exist] # output C # any key whose value does not exist will have this value
Accessing an element from Hash
We can retrieve values from a Hash using [] operator using a key inside it.
language = {name: 'Ruby', birth_year: 1995, type: 'language'}
puts language[:name] # Ruby
puts language[:birth_year] # 1995
puts language[:created_by] # Matz
puts language[:any_key_that_does_not_exist] # nil
Adding element to a Hash
If you want to add a new element(key-value pair) to Hash, we can do so by assigning a new value to a key.
The method is []= and we can see it being used below with “syntactic sugar”:
language = {name: 'Ruby', birth_year: 1995, type: 'language'}
language[:latest_version] = "2.7"
puts language
# output
{:name=>"Ruby", :birth_year=>1995, :type=>"language", :latest_version=>"2.7"}
Updating an existing element in a Hash
Suppose that you want to update the value of an existing element. You can do so by using the following syntax:
language = {name: 'Ruby', birth_year: 1995, type: 'language', latest_version: "2.7"}
# Update latest version to 2.8
language[:latest_version] = "3.2.2"
puts language
# output
{:name=>"Ruby", :birth_year=>1995, :type=>"language", :latest_version=>"3.2.2"}
Removing a key-value from an Array
You can delete a hash element using the following ways:
-
deletemethod: It will delete key-value pair whose key is matched with the provided key.language = {name: 'Ruby', birth_year: 1995, type: 'language'} language.delete(:type) # NOTE: language.delete('type') won't delete the element in above step puts language # {:name=>'Ruby', :birth_year=>1995}
If you use language.delete('type'), Ruby won't delete the element as Ruby treat 'type' as string and we have :type as a symbol in above key.
|
-
shiftmethod: Removes the first element from the Hash.language = {name: 'Ruby', birth_year: 1995, type: 'language'} language.shift puts language # {:birth_year=>1995, :type=>"language"}
Iterating over a Hash
Iterating over a Hash is similar to iterating over an Array with a few differences.
We have similar methods of iterating over Hash as we have for Array.
-
eachmethod:language = {name: 'Ruby', birth_year: 1995, type: 'language', latest_version: '2.7'} language.each do |key, value| puts "Language #{key} is #{value}." endOutput:
Language name is Ruby. Language birth_year is 1995. Language type is language. Language latest_version is 2.7.The above can be improved further as to have the intended output, i.e., no underscore in
birth_yearandlatest_versionin output.language = {name: 'Ruby', birth_year: 1995, type: 'language', latest_version: '2.7'} language.each do |key, value| puts "Language #{key.to_s.gsub('_', ' ')} is #{value}." endOutput:
Language name is Ruby. Language birth year is 1995. Language type is language. Language latest version is 2.7. -
each_keymethod iterates over aHashpassing its key as a parameter.language = {name: 'Ruby', birth_year: 1995, type: 'language'} language.each_key do |key| puts key endOutput:
name birth_year type -
each_valuemethod iterates over aHashpassing its value as a parameter.language = {name: 'Ruby', birth_year: 1995, type: 'language'} language.each_value do |value| puts value endOutput:
Ruby 1995 language
Some Hash methods
keys and values
The method keys and values return all the keys and values of a Hash as an Array, respectively.
language = {name: 'Ruby', birth_year: 1995, type: 'language'}
language.keys # [:name, :birth_year, :type]
language.values # ["Ruby", 1995, "language"]
has_key? or key?
The has_key? or key? method checks if a hash contains a specific key or not.
It returns a boolean value.
language = {name: 'Ruby', birth_year: 1995, type: 'language'}
language.has_key?(:type) # true
language.has_key?('type') # false
language.key?(:type) # true
NOTE: Methods has_key?, key?, and member? are aliases for include?.
has_value?
It returns true if the given value is present for some key in hash.
language = {name: 'Ruby', birth_year: 1995, type: 'language'}
language.has_value?('Ruby') # true
language.has_value?('C') # false
key(value)
It returns the key of the specified value passed as an argument.
If the value is not found, returns nil.
language = {name: 'Ruby', birth_year: 1995, type: 'language'}
language.key('Ruby') # name
language.key('Matz') # nil
select
It returns a new hash consisting of entries for which the block returns true.
language = {name: 'Ruby', birth_year: 1995, type: 'language'}
string_elements = language.select {|key, value| value.is_a?(String) }
puts string_elements # {:name=>"Ruby", :type=>"language"}
NOTE: You can see all Hash methods in their official documentation here.
Go through it and familiarize yourself.
There are many handy methods available.
Help me to improve Code To Earn (c2e).