Wenn Sie ActiveSupport (Rails) oder Backports verwenden, können Sie try
:
@hash[:key1].try(:fetch, :key2)
Sie könnten sogar mit @hash
unter nil
:
@hash.try(:fetch, :key1).try(:fetch, :key2)
Wenn Sie wollen @hash
um bei einem fehlenden Schlüssel immer einen Hash zurückzugeben:
@hash = Hash.new { |h,k| h[k] = {} }
@hash[:foo] # => {}
Sie könnten dies auch rekursiv definieren:
def recursive_hash
Hash.new { |h,k| h[k] = recursive_hash }
end
@hash = recursive_hash
@hash[:foo][:bar][:blah] = 10
@hash # => {:foo => {:bar => {:blah => 10}}}
Aber um Ihre Frage zu beantworten:
module HasNestedKey
Hash.send(:include, self)
def has_nested_key?(*args)
return false unless sub = self[args.shift]
return true if args.empty?
sub.respond_to?(:has_nested_key?) and sub.has_nested_key?(*args)
end
end
@hash.has_nested_key? :key1, :key2