class Sinatra::IndifferentHash
example the params
hash in Sinatra.
expected keys and it is convenient to understand both as the same. For
But this class is intended for use cases where strings or symbols are the
hash # => { “a”=>1, 0=>0 }
= 0
hash = Sinatra::IndifferentHash.new(:a=>1)
Technically other types of keys are accepted:
hash.keys # => [“a”]
You are guaranteed that the key is returned as a string:
hash = Sinatra::IndifferentHash.new(:a=>1)
belongs to the public interface. For example, given:
writing interface (calling e.g. []=
, merge
). This mapping
Internally, symbols are mapped to strings when used as keys in the entire<br><br>rgb # => ‘#FFFFFF’ # string retrieval<br>rgb # => ‘#FFFFFF’ # symbol retrieval<br>rgb = ‘#FFFFFF’ # string assignment<br><br>rgb # => ‘#000000’ # string retrieval<br>rgb # => ‘#000000’ # symbol retrieval<br>rgb = ‘#000000’ # symbol assignment
rgb = Sinatra::IndifferentHash.new
considered to be the same.
Implements a hash where keys :foo
and "foo"
are
stuff removed.
A poor man’s ActiveSupport::HashWithIndifferentAccess, with all the Rails-y
def self.[](*args)
def self.[](*args) new.merge!(Hash[*args]) end
def [](key)
def [](key) super(convert_key(key)) end
def []=(key, value)
def []=(key, value) super(convert_key(key), convert_value(value)) end
def assoc(key)
def assoc(key) super(convert_key(key)) end
def compact
def compact dup.tap(&:compact!) end if method_defined?(:compact) # Added in Ruby 2.4
def convert_key(key)
def convert_key(key) key.is_a?(Symbol) ? key.to_s : key end
def convert_value(value)
def convert_value(value) case value when Hash value.is_a?(self.class) ? value : self.class[value] when Array value.map(&method(:convert_value)) else value end end
def default(*args)
def default(*args) args.map!(&method(:convert_key)) super(*args) end
def default=(value)
def default=(value) super(convert_value(value)) end
def delete(key)
def delete(key) super(convert_key(key)) end
def dig(key, *other_keys)
def dig(key, *other_keys) super(convert_key(key), *other_keys) end if method_defined?(:dig) # Added in Ruby 2.3
def fetch(key, *args)
def fetch(key, *args) args.map!(&method(:convert_value)) super(convert_key(key), *args) end
def fetch_values(*keys)
def fetch_values(*keys) keys.map!(&method(:convert_key)) super(*keys) end if method_defined?(:fetch_values) # Added in Ruby 2.3
def initialize(*args)
def initialize(*args) args.map!(&method(:convert_value)) super(*args) end
def key(value)
def key(value) super(convert_value(value)) end
def key?(key)
def key?(key) super(convert_key(key)) end
def merge(*other_hashes, &block)
def merge(*other_hashes, &block) dup.merge!(*other_hashes, &block) end
def merge!(*other_hashes)
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
def rassoc(value)
def rassoc(value) super(convert_value(value)) end
def reject(*args, &block)
def reject(*args, &block) return to_enum(:reject) unless block_given? dup.tap { |hash| hash.reject!(*args, &block) } end
def replace(other_hash)
def replace(other_hash) super(other_hash.is_a?(self.class) ? other_hash : self.class[other_hash]) end
def select(*args, &block)
def select(*args, &block) return to_enum(:select) unless block_given? dup.tap { |hash| hash.select!(*args, &block) } end
def slice(*keys)
def slice(*keys) keys.map!(&method(:convert_key)) self.class[super(*keys)] end if method_defined?(:slice) # Added in Ruby 2.5
def transform_keys(&block)
def transform_keys(&block) dup.transform_keys!(&block) end
def transform_keys!
def transform_keys! super super(&method(:convert_key)) end
def transform_values(&block)
def transform_values(&block) dup.transform_values!(&block) end
def transform_values!
def transform_values! super super(&method(:convert_value)) end
def value?(value)
def value?(value) super(convert_value(value)) end
def values_at(*keys)
def values_at(*keys) keys.map!(&method(:convert_key)) super(*keys) end