Module: Gorillib::Hashlike::HashlikeViaAccessors

Defined in:
lib/gorillib/hashlike/hashlike_via_accessors.rb

Overview

Makes a Receiver thingie behave mostly like a hash.

By default, the hashlike methods iterate over the receiver attributes: instance #keys delegates to self.class.keys which calls receiver_attr_names. If you want to filter our add to the keys list, you can just override the class-level keys method (and call super, or not):

def self.keys
  super + [:firstname, :lastname] - [:fullname]
end

in addition to the below, by including Enumerable, this also adds

:each_cons, :each_entry, :each_slice, :each_with_index, :each_with_object,
:map, :collect, :collect_concat, :entries, :to_a, :flat_map, :inject, :reduce,
:group_by, :chunk, :cycle, :partition, :reverse_each, :slice_before, :drop,
:drop_while, :take, :take_while, :detect, :find, :find_all, :find_index, :grep,
:all?, :any?, :none?, :one?, :first, :count, :zip :max, :max_by, :min, :min_by,
:minmax, :minmax_by, :sort, :sort_by

As opposed to hash, does not define

default, default=, default_proc, default_proc=, shift, flatten, compare_by_identity compare_by_identity? rehash

Instance Method Summary collapse

Instance Method Details

#[](key) ⇒ Object

Hashlike#[]

Element Reference -- Retrieves the value stored for +key+.

In a normal hash, a default value can be set; none is provided here.

Delegates to self.send(key)

Examples:

hsh = { :a => 100, :b => 200 }
hsh[:a] # => 100
hsh[:c] # => nil

Parameters:

  • key (Object)

    key to retrieve

Returns:

  • (Object)

    the value stored for key, nil if missing



48
49
50
51
# File 'lib/gorillib/hashlike/hashlike_via_accessors.rb', line 48

def [](key)
  key = convert_key(key)
  self.send(key)
end

#[]=(key, val) ⇒ Object

Hashlike#[]= Hashlike#store

Element Assignment -- Associates the value given by +val+ with the key given by +key+.

key should not have its value changed while it is in use as a key. In a normal hash, a String passed as a key will be duplicated and frozen. No such guarantee is provided here

Delegates to self.send("key=", val)

Examples:

hsh = { :a => 100, :b => 200 }
hsh[:a] = 9
hsh[:c] = 4
hsh    # => { :a => 9, :b => 200, :c => 4 }

hsh[key] = val                         -> val
hsh.store(key, val)                    -> val

Parameters:

  • key (Object)

    key to associate

  • val (Object)

    value to associate it with

Returns:



78
79
80
81
# File 'lib/gorillib/hashlike/hashlike_via_accessors.rb', line 78

def []=(key, val)
  key = convert_key(key)
  self.send("#{key}=", val)
end

#hsh.delete(key) ⇒ Object, Nil #hsh.delete(key) {|Object| ... } ⇒ Object, Nil

Hashlike#delete

Deletes and returns the value from +hsh+ whose key is equal to +key+. If the optional code block is given and the key is not found, pass in the key and return the result of +block+.

In a normal hash, a default value can be set; none is provided here.

Examples:

hsh = { :a => 100, :b => 200 }
hsh.delete(:a)                            # => 100
hsh.delete(:z)                            # => nil
hsh.delete(:z){|el| "#{el} not found" }   # => "z not found"

Overloads:

  • #hsh.delete(key) ⇒ Object, Nil

    Returns the removed object, nil if missing.

    Parameters:

    • key (Object)

      key to remove

    Returns:

    • (Object, Nil)

      the removed object, nil if missing

  • #hsh.delete(key) {|Object| ... } ⇒ Object, Nil

    Returns the removed object, or if missing, the return value of the block.

    Parameters:

    • key (Object)

      key to remove

    Yields:

    • (Object)

      called (with key) if key is missing

    Yield Parameters:

    • key

    Returns:

    • (Object, Nil)

      the removed object, or if missing, the return value of the block



108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/gorillib/hashlike/hashlike_via_accessors.rb', line 108

def delete(key, &block)
  key = convert_key(key)
  if has_key?(key)
    val = self[key]
    self.send(:remove_instance_variable, "@#{key}")
    val
  elsif block_given?
    block.call(key)
  else
    nil
  end
end

#keysArray

Hashlike#keys

Returns a new array populated with the keys from this hashlike.

Examples:

hsh = { :a => 100, :b => 200, :c => 300, :d => 400 }
hsh.keys   # => [:a, :b, :c, :d]

Returns:

  • (Array)

    list of keys

See Also:

  • Hashlike#values.


157
158
159
# File 'lib/gorillib/hashlike/hashlike_via_accessors.rb', line 157

def keys
  instance_variables.map{|s| convert_key(s[1..-1]) }
end