我正在寻找一种避免在深度嵌套的哈希中的每个级别检查 nil
的好方法。例如:
name = params[:company][:owner][:name] if params[:company] && params[:company][:owner] && params[:company][:owner][:name]
这需要三项检查,并且代码非常丑陋。有什么办法可以解决这个问题?
最佳答案
引入了 Ruby 2.3.0 a method called dig
在 Hash
和 Array
上。
name = params.dig(:company, :owner, :name)
如果在任何级别缺少 key ,它返回 nil
。
如果您使用的 Ruby 版本早于 2.3,您可以安装 ruby_dig
或 hash_dig_and_collect
等 gem,或者自己实现功能:
module RubyDig
def dig(key, *rest)
if value = (self[key] rescue nil)
if rest.empty?
value
elsif value.respond_to?(:dig)
value.dig(*rest)
end
end
end
end
if RUBY_VERSION < '2.3'
Array.send(:include, RubyDig)
Hash.send(:include, RubyDig)
end
关于ruby-on-rails - 如何在不重复 nil 检查的情况下避免嵌套哈希中缺少元素的 NoMethodError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4371716/