是否有一个更好的一个班轮处理“除非something.nil?||某事[:key] .nil?”

时间:2010-09-16 09:04:33

标签: ruby-on-rails ruby

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

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

7 个答案:

答案 0 :(得分:1)

是的,有。

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

答案 1 :(得分:1)

您可以使用:

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

哇,谢谢所有的回复!

我将总结答案 - 因为答案似乎比另一个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]

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

再次感谢大家! : - )

答案 4 :(得分:0)

明确的清晰度!

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

就个人而言,我会选择原件。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

这是一个简单的想法。

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

使用merge很有意思。

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