Class: Hashery::QueryHash
- Defined in:
- lib/hashery/query_hash.rb
Overview
QueryHash is essentially a Hash class, but with some OpenStruct-like features.
q = QueryHash.new
Entries can be added to the Hash via a setter method.
q.a = 1
Then looked up via a query method.
q.a? #=> 1
The can also be looked up via a bang method.
q.a! #=> 1
The difference between query methods and bang methods is that the bang method will auto-instantiate the entry if not present, where as a query method will not.
A QueryHash might not be quite as elegant as an OpenHash in that reader methods must end in ‘?` or `!`, but it remains fully compatible with Hash regardless of it’s settings.
Constant Summary
Constants inherited from CRUDHash
Instance Method Summary collapse
-
#initialize(*default, &default_proc) ⇒ QueryHash
constructor
By default the ‘key_proc` is set to convert all keys to strings via `#to_s`.
-
#method_missing(s, *a, &b) ⇒ Object
Route get and set calls.
-
#respond_to?(name) ⇒ Boolean
Custom #respond_to to account for #method_missing.
Methods inherited from CRUDHash
#<<, [], #[], #[]=, auto, #cast, #cast_key, #default_proc, #delete, #each, #fetch, #key?, #key_proc, #key_proc=, #merge, #read, #replace, #retrieve, #store, #to_hash, #update, #values_at
Methods inherited from Hash
create, #rekey, #rekey!, #retrieve, #to_hash, #to_stash
Constructor Details
#initialize(*default, &default_proc) ⇒ QueryHash
By default the ‘key_proc` is set to convert all keys to strings via `#to_s`.
36 37 38 39 |
# File 'lib/hashery/query_hash.rb', line 36 def initialize(*default, &default_proc) @key_proc = Proc.new{ |k| k.to_s } super(*default, &default_proc) end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(s, *a, &b) ⇒ Object
Route get and set calls.
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/hashery/query_hash.rb', line 55 def method_missing(s,*a, &b) type = s.to_s[-1,1] name = s.to_s.sub(/[!?=]$/, '') key = name #key = cast_key(name) case type when '=' store(key, a.first) when '!' default = (default_proc ? default_proc.call(self, key) : default) key?(key) ? fetch(key) : store(key, default) when '?' key?(key) ? fetch(key) : nil else # return self[key] if key?(key) super(s,*a,&b) end end |
Instance Method Details
#respond_to?(name) ⇒ Boolean
Custom #respond_to to account for #method_missing.
81 82 83 84 85 86 87 |
# File 'lib/hashery/query_hash.rb', line 81 def respond_to?(name) return true if name.to_s.end_with?('=') return true if name.to_s.end_with?('?') return true if name.to_s.end_with?('!') #key?(name.to_sym) || super(name) super(name) end |