Module: Mobj::HashEx

Defined in:
lib/ext/hash.rb

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/ext/hash.rb', line 54

def method_missing(name, *args, &block)
  value = if name[-1] == '=' && args.size == 1
    key = name[0...-1].sym
    key = key.to_s if key?(key.to_s)
    self[key] = args.sequester!
  elsif name[-1] == '?'
    key = name[0...-1].sym
    !!self[key, key.to_s]
  elsif name[-1] == '!'
    key = name[0...-1].sym
    val = self[key.sym] || self[key.to_s]
    if !val && (block || args.unempty?)
      self[key] = val = (block ? block.call(*args) : args.sequester!)
    end
    super unless val
  else
    self[name.sym] || self[name.to_s]
  end
  value ||= args.sequester! unless args.empty?

  return block ? block[value] : value
end

Instance Method Details

#apply!(obj) ⇒ Object



14
15
16
17
18
# File 'lib/ext/hash.rb', line 14

def apply!(obj)
  map do |key, value|
    obj.send(key, *value)
  end
end

#denil!Object



77
78
79
# File 'lib/ext/hash.rb', line 77

def denil!
  reject!{ |k, v| k.nil? || v.nil? }
end

#filled?Boolean Also known as: notempty?, noempty?, full?, unempty?

Returns:

  • (Boolean)


7
# File 'lib/ext/hash.rb', line 7

def filled?() !mt? end

#ki(name) ⇒ Object



20
21
22
# File 'lib/ext/hash.rb', line 20

def ki(name)
  name.to_s[/(.*?)[?!=]?$/, 1]
end

#ki?(name) ⇒ Boolean

Returns:

  • (Boolean)


24
25
26
# File 'lib/ext/hash.rb', line 24

def ki?(name)
  [name.sym, name.to_s, ki(name).sym, ki(name).to_s].any? { |k| key?(k) }
end

#symvert(key_converter = :itself, value_converter = key_converter) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/ext/hash.rb', line 28

def symvert(key_converter = :itself, value_converter = key_converter)
  each.with_object({}) do |(k, v), o|
    key = if key_converter.p?
      key_converter.call(k, v)
    elsif k.respond_to?(key_converter.sym)
      k.__send__(key_converter.sym)
    else
      k
    end

    value = if value_converter.p?
      value_converter.arity == 1 ? value_converter.call(v) : value_converter.call(k, v)
    elsif v.respond_to?(value_converter.sym)
      v.__send__(value_converter.sym)
    else
      v
    end

    o[key] = value
  end
end

#symvert!(key_converter = :itself, value_converter = key_converter) ⇒ Object



50
51
52
# File 'lib/ext/hash.rb', line 50

def symvert!(key_converter = :itself, value_converter = key_converter)
  replace(symvert(key_converter, value_converter))
end