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(: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.new(: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.
- #fetch(key, *args) ⇒ Object
- #fetch_values(*keys) ⇒ Object
-
#initialize(*args) ⇒ IndifferentHash
constructor
A new instance of IndifferentHash.
- #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
Constructor Details
#initialize(*args) ⇒ IndifferentHash
Returns a new instance of IndifferentHash.
44 45 46 47 48 |
# File 'lib/sinatra/indifferent_hash.rb', line 44 def initialize(*args) args.map!(&method(:convert_value)) super(*args) end |
Class Method Details
.[](*args) ⇒ Object
40 41 42 |
# File 'lib/sinatra/indifferent_hash.rb', line 40 def self.[](*args) new.merge!(Hash[*args]) end |
Instance Method Details
#[](key) ⇒ Object
74 75 76 |
# File 'lib/sinatra/indifferent_hash.rb', line 74 def [](key) super(convert_key(key)) end |
#[]=(key, value) ⇒ Object Also known as: store
78 79 80 |
# File 'lib/sinatra/indifferent_hash.rb', line 78 def []=(key, value) super(convert_key(key), convert_value(value)) end |
#assoc(key) ⇒ Object
60 61 62 |
# File 'lib/sinatra/indifferent_hash.rb', line 60 def assoc(key) super(convert_key(key)) end |
#compact ⇒ Object
185 186 187 |
# File 'lib/sinatra/indifferent_hash.rb', line 185 def compact dup.tap(&:compact!) end |
#default(*args) ⇒ Object
50 51 52 53 54 |
# File 'lib/sinatra/indifferent_hash.rb', line 50 def default(*args) args.map!(&method(:convert_key)) super(*args) end |
#default=(value) ⇒ Object
56 57 58 |
# File 'lib/sinatra/indifferent_hash.rb', line 56 def default=(value) super(convert_value(value)) end |
#delete(key) ⇒ Object
102 103 104 |
# File 'lib/sinatra/indifferent_hash.rb', line 102 def delete(key) super(convert_key(key)) end |
#dig(key, *other_keys) ⇒ Object
Added in Ruby 2.3
107 108 109 |
# File 'lib/sinatra/indifferent_hash.rb', line 107 def dig(key, *other_keys) super(convert_key(key), *other_keys) end |
#fetch(key, *args) ⇒ Object
68 69 70 71 72 |
# File 'lib/sinatra/indifferent_hash.rb', line 68 def fetch(key, *args) args.map!(&method(:convert_value)) super(convert_key(key), *args) end |
#fetch_values(*keys) ⇒ Object
111 112 113 114 115 |
# File 'lib/sinatra/indifferent_hash.rb', line 111 def fetch_values(*keys) keys.map!(&method(:convert_key)) super(*keys) end |
#key(value) ⇒ Object
84 85 86 |
# File 'lib/sinatra/indifferent_hash.rb', line 84 def key(value) super(convert_value(value)) end |
#key?(key) ⇒ Boolean Also known as: has_key?, include?, member?
88 89 90 |
# File 'lib/sinatra/indifferent_hash.rb', line 88 def key?(key) super(convert_key(key)) end |
#merge(*other_hashes, &block) ⇒ Object
147 148 149 |
# File 'lib/sinatra/indifferent_hash.rb', line 147 def merge(*other_hashes, &block) dup.merge!(*other_hashes, &block) end |
#merge!(*other_hashes) ⇒ Object Also known as: update
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
# File 'lib/sinatra/indifferent_hash.rb', line 129 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
64 65 66 |
# File 'lib/sinatra/indifferent_hash.rb', line 64 def rassoc(value) super(convert_value(value)) end |
#reject(*args, &block) ⇒ Object
179 180 181 182 183 |
# File 'lib/sinatra/indifferent_hash.rb', line 179 def reject(*args, &block) return to_enum(:reject) unless block_given? dup.tap { |hash| hash.reject!(*args, &block) } end |
#replace(other_hash) ⇒ Object
151 152 153 |
# File 'lib/sinatra/indifferent_hash.rb', line 151 def replace(other_hash) super(other_hash.is_a?(self.class) ? other_hash : self.class[other_hash]) end |
#select(*args, &block) ⇒ Object
173 174 175 176 177 |
# File 'lib/sinatra/indifferent_hash.rb', line 173 def select(*args, &block) return to_enum(:select) unless block_given? dup.tap { |hash| hash.select!(*args, &block) } end |
#slice(*keys) ⇒ Object
117 118 119 120 121 |
# File 'lib/sinatra/indifferent_hash.rb', line 117 def slice(*keys) keys.map!(&method(:convert_key)) self.class[super(*keys)] end |
#transform_keys(&block) ⇒ Object
164 165 166 |
# File 'lib/sinatra/indifferent_hash.rb', line 164 def transform_keys(&block) dup.transform_keys!(&block) end |
#transform_keys! ⇒ Object
168 169 170 171 |
# File 'lib/sinatra/indifferent_hash.rb', line 168 def transform_keys! super super(&method(:convert_key)) end |
#transform_values(&block) ⇒ Object
155 156 157 |
# File 'lib/sinatra/indifferent_hash.rb', line 155 def transform_values(&block) dup.transform_values!(&block) end |
#transform_values! ⇒ Object
159 160 161 162 |
# File 'lib/sinatra/indifferent_hash.rb', line 159 def transform_values! super super(&method(:convert_value)) end |
#value?(value) ⇒ Boolean Also known as: has_value?
96 97 98 |
# File 'lib/sinatra/indifferent_hash.rb', line 96 def value?(value) super(convert_value(value)) end |
#values_at(*keys) ⇒ Object
123 124 125 126 127 |
# File 'lib/sinatra/indifferent_hash.rb', line 123 def values_at(*keys) keys.map!(&method(:convert_key)) super(*keys) end |