Kev*_*tre 28 ruby hash ruby-on-rails hash-of-hashes
我正在寻找一种避免nil在深层嵌套哈希中检查每个级别的好方法.例如:
name = params[:company][:owner][:name] if params[:company] && params[:company][:owner] && params[:company][:owner][:name]
Run Code Online (Sandbox Code Playgroud)
这需要三次检查,并且会产生非常难看的代码.有办法解决这个问题吗?
use*_*951 28
Ruby 2.3.0引入了一个名为dig on 的新方法Hash,Array它完全解决了这个问题.
name = params.dig(:company, :owner, :name)
Run Code Online (Sandbox Code Playgroud)
nil如果在任何级别缺少密钥,它将返回.
如果您使用的是早于2.3的Ruby版本,则可以使用ruby_dig 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
Run Code Online (Sandbox Code Playgroud)
Chu*_*uck 11
功能性和清晰度之间的最佳折衷IMO是Raganwald andand.有了它,你会做:
params[:company].andand[:owner].andand[:name]
Run Code Online (Sandbox Code Playgroud)
它类似于try,但在这种情况下读取更好,因为你仍然像正常一样发送消息,但是在它之间有一个分隔符,要求注意你要特别处理nils的事实.
我不知道这是不是你想要的,但也许你可以做到这一点?
name = params[:company][:owner][:name] rescue nil
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3547 次 |
| 最近记录: |