Class: HashWithIndifferentAccess
Overview
This class is taken from the ActiveSupport gem. With yaml, keys are stored as string. But when we convert xml to hash, we store the key as symbol. To make it more convenient, we’ll be subclassing our metadata hash with this class. That way, we can access our metadata using either string or symbol as the key.
Instance Method Summary collapse
-
#[]=(key, value) ⇒ Object
Assigns a new value to the hash:.
- #default(key = nil) ⇒ Object
-
#delete(key) ⇒ Object
Removes a specified key from the hash.
-
#dup ⇒ Object
Returns an exact copy of the hash.
-
#fetch(key, *extras) ⇒ Object
Fetches the value for the specified key, same as doing hash.
-
#initialize(constructor = {}) ⇒ HashWithIndifferentAccess
constructor
A new instance of HashWithIndifferentAccess.
-
#key?(key) ⇒ Boolean
(also: #include?, #has_key?, #member?)
Checks the hash for a key matching the argument passed in:.
-
#merge(hash) ⇒ Object
Merges the instantized and the specified hashes together, giving precedence to the values from the second hash Does not overwrite the existing hash.
- #regular_update ⇒ Object
- #regular_writer ⇒ Object
- #stringify_keys! ⇒ Object
- #symbolize_keys! ⇒ Object
-
#to_hash ⇒ Object
Convert to a Hash with String keys.
- #to_options! ⇒ Object
-
#update(other_hash) ⇒ Object
(also: #merge!)
Updates the instantized hash with values from the second:.
-
#values_at(*indices) ⇒ Object
Returns an array of the values at the specified indices:.
Methods included from HashUtils
#recursively, #rekey, #stringify_keys, #symbolize_keys
Methods included from IndifferentAccess
Constructor Details
#initialize(constructor = {}) ⇒ HashWithIndifferentAccess
Returns a new instance of HashWithIndifferentAccess.
25 26 27 28 29 30 31 32 |
# File 'lib/tpkg/metadata.rb', line 25 def initialize(constructor = {}) if constructor.is_a?(Hash) super() update(constructor) else super(constructor) end end |
Instance Method Details
#[]=(key, value) ⇒ Object
Assigns a new value to the hash:
hash = HashWithIndifferentAccess.new
hash[:key] = "value"
50 51 52 |
# File 'lib/tpkg/metadata.rb', line 50 def []=(key, value) regular_writer(convert_key(key), convert_value(value)) end |
#default(key = nil) ⇒ Object
34 35 36 37 38 39 40 |
# File 'lib/tpkg/metadata.rb', line 34 def default(key = nil) if key.is_a?(Symbol) && include?(key = key.to_s) self[key] else super end end |
#delete(key) ⇒ Object
Removes a specified key from the hash.
114 115 116 |
# File 'lib/tpkg/metadata.rb', line 114 def delete(key) super(convert_key(key)) end |
#dup ⇒ Object
Returns an exact copy of the hash.
103 104 105 |
# File 'lib/tpkg/metadata.rb', line 103 def dup HashWithIndifferentAccess.new(self) end |
#fetch(key, *extras) ⇒ Object
Fetches the value for the specified key, same as doing hash
87 88 89 |
# File 'lib/tpkg/metadata.rb', line 87 def fetch(key, *extras) super(convert_key(key), *extras) end |
#key?(key) ⇒ Boolean Also known as: include?, has_key?, member?
Checks the hash for a key matching the argument passed in:
hash = HashWithIndifferentAccess.new
hash["key"] = "value"
hash.key? :key # => true
hash.key? "key" # => true
78 79 80 |
# File 'lib/tpkg/metadata.rb', line 78 def key?(key) super(convert_key(key)) end |
#merge(hash) ⇒ Object
Merges the instantized and the specified hashes together, giving precedence to the values from the second hash Does not overwrite the existing hash.
109 110 111 |
# File 'lib/tpkg/metadata.rb', line 109 def merge(hash) self.dup.update(hash) end |
#regular_update ⇒ Object
43 |
# File 'lib/tpkg/metadata.rb', line 43 alias_method :regular_update, :update |
#regular_writer ⇒ Object
42 |
# File 'lib/tpkg/metadata.rb', line 42 alias_method :regular_writer, :[]= |
#stringify_keys! ⇒ Object
118 |
# File 'lib/tpkg/metadata.rb', line 118 def stringify_keys!; self end |
#symbolize_keys! ⇒ Object
119 |
# File 'lib/tpkg/metadata.rb', line 119 def symbolize_keys!; self end |
#to_hash ⇒ Object
Convert to a Hash with String keys.
123 124 125 |
# File 'lib/tpkg/metadata.rb', line 123 def to_hash Hash.new(default).merge(self) end |
#to_options! ⇒ Object
120 |
# File 'lib/tpkg/metadata.rb', line 120 def ; self end |
#update(other_hash) ⇒ Object Also known as: merge!
Updates the instantized hash with values from the second:
hash_1 = HashWithIndifferentAccess.new
hash_1[:key] = "value"
hash_2 = HashWithIndifferentAccess.new
hash_2[:key] = "New Value!"
hash_1.update(hash_2) # => {"key"=>"New Value!"}
64 65 66 67 |
# File 'lib/tpkg/metadata.rb', line 64 def update(other_hash) other_hash.each_pair { |key, value| regular_writer(convert_key(key), convert_value(value)) } self end |
#values_at(*indices) ⇒ Object
Returns an array of the values at the specified indices:
hash = HashWithIndifferentAccess.new
hash[:a] = "x"
hash[:b] = "y"
hash.values_at("a", "b") # => ["x", "y"]
98 99 100 |
# File 'lib/tpkg/metadata.rb', line 98 def values_at(*indices) indices.collect {|key| self[convert_key(key)]} end |