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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
# File 'lib/ext/hash.rb', line 47
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
7
8
9
10
11
|
# File 'lib/ext/hash.rb', line 7
def apply!(obj)
map do |key, value|
obj.send(key, *value)
end
end
|
13
14
15
|
# File 'lib/ext/hash.rb', line 13
def ki(name)
name.to_s[/(.*?)[?!=]?$/, 1]
end
|
#ki?(name) ⇒ Boolean
17
18
19
|
# File 'lib/ext/hash.rb', line 17
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
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
# File 'lib/ext/hash.rb', line 21
def symvert(key_converter = :itself, value_converter = key_converter)
each.with_object({}) do |(k, v), o|
key = if key_converter.is_a?(Proc)
key_converter.call(k, v)
elsif k.respond_to?(key_converter.sym)
k.__send__(key_converter.sym)
else
k
end
value = if value_converter.is_a?(Proc)
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
43
44
45
|
# File 'lib/ext/hash.rb', line 43
def symvert!(key_converter = :itself, value_converter = key_converter)
replace(symvert(key_converter, value_converter))
end
|