Module: RespondToDig
- Defined in:
- lib/respond_to_dig.rb,
lib/respond_to_dig/version.rb
Constant Summary collapse
- VERSION =
'1.0.1'.freeze
Class Method Summary collapse
-
.diggable?(target) ⇒ Boolean
The reason why not purely duck typed by ‘[]` method is to avoid unexpected behavior, for example we won’t get ‘’o’‘ by `’foo’.dig(1)‘ by String#[].
- .respond_to_dig(receiver) ⇒ Object
Instance Method Summary collapse
Class Method Details
.diggable?(target) ⇒ Boolean
The reason why not purely duck typed by ‘[]` method is to avoid unexpected behavior, for example we won’t get ‘’o’‘ by `’foo’.dig(1)‘ by String#[].
12 13 14 15 16 |
# File 'lib/respond_to_dig.rb', line 12 def diggable?(target) target.is_a? Enumerable and target.respond_to? :[] and not target.respond_to? :dig end |
.respond_to_dig(receiver) ⇒ Object
4 5 6 7 8 |
# File 'lib/respond_to_dig.rb', line 4 def respond_to_dig(receiver) receiver.tap do |r| r.singleton_class.send(:include, RespondToDig) if RespondToDig.diggable? r end end |
Instance Method Details
#dig(key, *rest) ⇒ Object
19 20 21 22 23 24 25 26 27 28 |
# File 'lib/respond_to_dig.rb', line 19 def dig(key, *rest) value = RespondToDig::respond_to_dig(self[key]) if value.nil? || rest.empty? value elsif value.respond_to?(:dig) value.dig(*rest) else fail TypeError, "#{value.class} does not have #dig method" end end |