Class: Sinatra::IndifferentHash
- Inherits:
-
Hash
- Object
- Hash
- Sinatra::IndifferentHash
- Defined in:
- lib/sinatra/indifferent_hash.rb
Overview
A poor man's ActiveSupport::HashWithIndifferentAccess, with all the Rails-y stuff removed.
Implements a hash where keys :foo and "foo" are considered to be the same.
rgb = Sinatra::IndifferentHash.new
rgb[:black] = '#000000' # symbol assignment
rgb[:black] # => '#000000' # symbol retrieval
rgb['black'] # => '#000000' # string retrieval
rgb['white'] = '#FFFFFF' # string assignment
rgb[:white] # => '#FFFFFF' # symbol retrieval
rgb['white'] # => '#FFFFFF' # string retrieval
Internally, symbols are mapped to strings when used as keys in the entire writing interface (calling e.g. []=, merge). This mapping belongs to the public interface. For example, given:
hash = Sinatra::IndifferentHash.new
hash[:a] = 1
You are guaranteed that the key is returned as a string:
hash.keys # => ["a"]
Technically other types of keys are accepted:
hash = Sinatra::IndifferentHash
hash[:a] = 1
hash[0] = 0
hash # => { "a"=>1, 0=>0 }
But this class is intended for use cases where strings or symbols are the
expected keys and it is convenient to understand both as the same. For
example the params hash in Sinatra.
Class Method Summary collapse
Instance Method Summary collapse
- #[](key) ⇒ Object
- #[]=(key, value) ⇒ Object (also: #store)
- #assoc(key) ⇒ Object
- #compact ⇒ Object
- #default(*args) ⇒ Object
- #default=(value) ⇒ Object
- #delete(key) ⇒ Object
-
#dig(key, *other_keys) ⇒ Object
Added in Ruby 2.3.
- #except(*keys) ⇒ Object
- #fetch(key, *args) ⇒ Object
- #fetch_values(*keys) ⇒ Object
- #key(value) ⇒ Object
- #key?(key) ⇒ Boolean (also: #has_key?, #include?, #member?)
- #merge(*other_hashes, &block) ⇒ Object
- #merge!(*other_hashes) ⇒ Object (also: #update)
- #rassoc(value) ⇒ Object
- #reject(*args, &block) ⇒ Object
- #replace(other_hash) ⇒ Object
- #select(*args, &block) ⇒ Object
- #slice(*keys) ⇒ Object
- #transform_keys(&block) ⇒ Object
- #transform_keys! ⇒ Object
- #transform_values(&block) ⇒ Object
- #transform_values! ⇒ Object
- #value?(value) ⇒ Boolean (also: #has_value?)
- #values_at(*keys) ⇒ Object
Class Method Details
.[](*args) ⇒ Object
42 43 44 |
# File 'lib/sinatra/indifferent_hash.rb', line 42 def self.[](*args) new.merge!(Hash[*args]) end |
Instance Method Details
#[](key) ⇒ Object
70 71 72 |
# File 'lib/sinatra/indifferent_hash.rb', line 70 def [](key) super(convert_key(key)) end |
#[]=(key, value) ⇒ Object Also known as: store
74 75 76 |
# File 'lib/sinatra/indifferent_hash.rb', line 74 def []=(key, value) super(convert_key(key), convert_value(value)) end |
#assoc(key) ⇒ Object
56 57 58 |
# File 'lib/sinatra/indifferent_hash.rb', line 56 def assoc(key) super(convert_key(key)) end |
#compact ⇒ Object
181 182 183 |
# File 'lib/sinatra/indifferent_hash.rb', line 181 def compact dup.tap(&:compact!) end |
#default(*args) ⇒ Object
46 47 48 49 50 |
# File 'lib/sinatra/indifferent_hash.rb', line 46 def default(*args) args.map!(&method(:convert_key)) super(*args) end |
#default=(value) ⇒ Object
52 53 54 |
# File 'lib/sinatra/indifferent_hash.rb', line 52 def default=(value) super(convert_value(value)) end |
#delete(key) ⇒ Object
98 99 100 |
# File 'lib/sinatra/indifferent_hash.rb', line 98 def delete(key) super(convert_key(key)) end |
#dig(key, *other_keys) ⇒ Object
Added in Ruby 2.3
103 104 105 |
# File 'lib/sinatra/indifferent_hash.rb', line 103 def dig(key, *other_keys) super(convert_key(key), *other_keys) end |
#except(*keys) ⇒ Object
185 186 187 188 189 |
# File 'lib/sinatra/indifferent_hash.rb', line 185 def except(*keys) keys.map!(&method(:convert_key)) self.class[super(*keys)] end |
#fetch(key, *args) ⇒ Object
64 65 66 67 68 |
# File 'lib/sinatra/indifferent_hash.rb', line 64 def fetch(key, *args) args.map!(&method(:convert_value)) super(convert_key(key), *args) end |
#fetch_values(*keys) ⇒ Object
107 108 109 110 111 |
# File 'lib/sinatra/indifferent_hash.rb', line 107 def fetch_values(*keys) keys.map!(&method(:convert_key)) super(*keys) end |
#key(value) ⇒ Object
80 81 82 |
# File 'lib/sinatra/indifferent_hash.rb', line 80 def key(value) super(convert_value(value)) end |
#key?(key) ⇒ Boolean Also known as: has_key?, include?, member?
84 85 86 |
# File 'lib/sinatra/indifferent_hash.rb', line 84 def key?(key) super(convert_key(key)) end |
#merge(*other_hashes, &block) ⇒ Object
143 144 145 |
# File 'lib/sinatra/indifferent_hash.rb', line 143 def merge(*other_hashes, &block) dup.merge!(*other_hashes, &block) end |
#merge!(*other_hashes) ⇒ Object Also known as: update
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/sinatra/indifferent_hash.rb', line 125 def merge!(*other_hashes) other_hashes.each do |other_hash| if other_hash.is_a?(self.class) super(other_hash) else other_hash.each_pair do |key, value| key = convert_key(key) value = yield(key, self[key], value) if block_given? && key?(key) self[key] = convert_value(value) end end end self end |
#rassoc(value) ⇒ Object
60 61 62 |
# File 'lib/sinatra/indifferent_hash.rb', line 60 def rassoc(value) super(convert_value(value)) end |
#reject(*args, &block) ⇒ Object
175 176 177 178 179 |
# File 'lib/sinatra/indifferent_hash.rb', line 175 def reject(*args, &block) return to_enum(:reject) unless block_given? dup.tap { |hash| hash.reject!(*args, &block) } end |
#replace(other_hash) ⇒ Object
147 148 149 |
# File 'lib/sinatra/indifferent_hash.rb', line 147 def replace(other_hash) super(other_hash.is_a?(self.class) ? other_hash : self.class[other_hash]) end |
#select(*args, &block) ⇒ Object
169 170 171 172 173 |
# File 'lib/sinatra/indifferent_hash.rb', line 169 def select(*args, &block) return to_enum(:select) unless block_given? dup.tap { |hash| hash.select!(*args, &block) } end |
#slice(*keys) ⇒ Object
113 114 115 116 117 |
# File 'lib/sinatra/indifferent_hash.rb', line 113 def slice(*keys) keys.map!(&method(:convert_key)) self.class[super(*keys)] end |
#transform_keys(&block) ⇒ Object
160 161 162 |
# File 'lib/sinatra/indifferent_hash.rb', line 160 def transform_keys(&block) dup.transform_keys!(&block) end |
#transform_keys! ⇒ Object
164 165 166 167 |
# File 'lib/sinatra/indifferent_hash.rb', line 164 def transform_keys! super super(&method(:convert_key)) end |
#transform_values(&block) ⇒ Object
151 152 153 |
# File 'lib/sinatra/indifferent_hash.rb', line 151 def transform_values(&block) dup.transform_values!(&block) end |
#transform_values! ⇒ Object
155 156 157 158 |
# File 'lib/sinatra/indifferent_hash.rb', line 155 def transform_values! super super(&method(:convert_value)) end |
#value?(value) ⇒ Boolean Also known as: has_value?
92 93 94 |
# File 'lib/sinatra/indifferent_hash.rb', line 92 def value?(value) super(convert_value(value)) end |
#values_at(*keys) ⇒ Object
119 120 121 122 123 |
# File 'lib/sinatra/indifferent_hash.rb', line 119 def values_at(*keys) keys.map!(&method(:convert_key)) super(*keys) end |