是否有一个更好的oneliner处理“除非somthing.nil? || 东西 .nil“?

有没有办法让这个衬里看起来更好看?

@var = params[:key1][:key2] unless params.blank? || params[:key1].blank? 

就在这里。

 @var = params && params[:key1] && params[:key1][:key2] 

只是为了让你知道你也可以这样做,但我不确定它是更好看:)(你必须在ror):

 @var = params.try(:fetch, :key1, nil).try(:fetch, :key2, nil) 

哇,谢谢你的回复!

我将总结答案 – 因为答案似乎比另一个oneliner更微妙;-)

正如gertas指出params总是存在于一个控制器动作中(这确实是我工作的地方),并且nil检查就足够了,因此我的原始代码可以简化为:

 @var = params[:key1][:key2] unless params[:key1].nil? 

这很可读但不像其他建议那么简短

 params[:key1].nil? || (@var = params[:key1][:key2]) @var = params[:key1] && params[:key1][:key2] 

甚至

 @var = (params[:key1] || {})[:key2] 

我想知道如何在哈希上使用rubys try()方法,而hellvinz给出了答案(重写以匹配我的新/已实现的需求):

 @var = params[:key1].try(:fetch, :key2, nil) 

最后,Shinya Miyazaki使用fetch和merge提出了一些有趣的变化:

 @var = params.fetch(:key1, {}).fetch(:key2, nil) @var = {:key1=>{}}.merge(params)[:key1][:key2] 

我最终选择了“我自己的”,以遵守克里斯麦考利所指出的“克服简洁”的原则

再次感谢大家! 🙂

你可以用这个:

 params.blank? || params[:key1].blank? || (@var = params[:key1][:key2]) 

但是你的方式对我来说更具可读性。

我假设你在控制器中使用它(params allways present – not nil):

@var = (params[:key1] || {})[:key2]

这是一个简单的想法。

 @var = params.fetch(:key1, {}).fetch(:key2, nil) 

使用merge很有意思。

 @var = {:key1=>{}}.merge(params)[:key1][:key2] 

清晰明了!

在更改原始代码之前,请问自己,阅读代码的下一个人是否会发现您的代码比此处建议的替代方案更易于理解。

就个人而言,我会选择你原来的。