猿问

如何避免NoMethodError在嵌套哈希中缺少元素,而不重复nil检查?

如何避免NoMethodError在嵌套哈希中缺少元素,而不重复nil检查?

我正在寻找一种避免nil在深层嵌套哈希中检查每个级别的好方法。例如:

name = params[:company][:owner][:name] if params[:company] && params[:company][:owner] && params[:company][:owner][:name]

这需要三次检查,并且会产生非常难看的代码。有办法解决这个问题吗?


素胚勾勒不出你
浏览 574回答 3
3回答

慕工程0101907

Ruby 2.3.0引入了一个名为dig&nbsp;on&nbsp;的新方法Hash,Array它完全解决了这个问题。name&nbsp;=&nbsp;params.dig(:company,&nbsp;:owner,&nbsp;:name)nil如果在任何级别缺少密钥,它将返回。如果您使用的是早于2.3的Ruby版本,则可以使用ruby_dig gem或自行实现:module&nbsp;RubyDig &nbsp;&nbsp;def&nbsp;dig(key,&nbsp;*rest) &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;value&nbsp;=&nbsp;(self[key]&nbsp;rescue&nbsp;nil) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;rest.empty? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elsif&nbsp;value.respond_to?(:dig) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value.dig(*rest) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end &nbsp;&nbsp;&nbsp;&nbsp;end &nbsp;&nbsp;endendif&nbsp;RUBY_VERSION&nbsp;<&nbsp;'2.3' &nbsp;&nbsp;Array.send(:include,&nbsp;RubyDig) &nbsp;&nbsp;Hash.send(:include,&nbsp;RubyDig)end

子衿沉夜

功能性和清晰度之间的最佳折衷IMO是Raganwald&nbsp;andand。有了它,你会做:params[:company].andand[:owner].andand[:name]它类似于try,但在这种情况下读取更好,因为你仍然像正常一样发送消息,但是在它之间有一个分隔符,要求注意你要特别处理nils的事实。

哈士奇WWW

我不知道这是不是你想要的,但也许你可以做到这一点?name&nbsp;=&nbsp;params[:company][:owner][:name]&nbsp;rescue&nbsp;nil
随时随地看视频慕课网APP

相关分类

Ruby
我要回答