习惯性的方式不使用红宝石条件(替代elsunless)

时间:2014-12-04 20:46:36

标签: ruby conditional-statements control-flow

我有以下逻辑:

if something == 'some string'
  somevar1 = 'some extra extra extra extra extra extra long string'
elsif !somevar
  somevar1 = 'a much longer string a much longer string'
  somevar2 = 'some very very very long string'
end

现在我的问题是根据我读过的文件,条件中的第二次检查似乎不是惯用的。

但是,我必须在条件中执行第一次检查。

我读到的所有内容都声明使用'除非'但除非是不好的做法。所以我想在这里寻找最完美的解决方案。

提前多多谢谢!

1 个答案:

答案 0 :(得分:2)

我一直有同样的问题,但我会抛弃我的想法。

关于unlesselse的使用,不好的做法是:

unless condition
  # stuff1
else
  # stuff2
end

这是一种不好的做法,因为正如您可能猜到的那样,您可以用更好,更逻辑合理和清晰的方式编写它:

if condition
  stuff2
else
  stuff1
end

更好,对吧?

然而,在像你这样的情况下,你无法翻转条件。因此,如果你想使用unless,你将会这样使用它:

if something == 'some string'
  somevar1 = 'some extra extra extra extra extra extra long string'
else
  unless somevar
    somevar1 = 'a much longer string a much longer string'
    somevar2 = 'some very very very long string'
  end
end

这在可读和逻辑上是合理的。

但是,如果您对somevar的类型有明确的了解,并且当它变为 false 时,您最好坚持使用somevar.false?之类的方法。当然,据我所知,对于所有对象都没有这样的false?方法,因此您可能希望使用nil?或/和类似的东西。

if something == 'some string'
  somevar1 = 'some extra extra extra extra extra extra long string'
elsif somevar.nil?
  somevar1 = 'a much longer string a much longer string'
  somevar2 = 'some very very very long string'
end

例如,对于字符串,您可以添加.empty?检查是否适合您:

if something == 'some string'
  somevar1 = 'some extra extra extra extra extra extra long string'
elsif somevar.nil? or somevar.empty?
  somevar1 = 'a much longer string a much longer string'
  somevar2 = 'some very very very long string'
end

当然,当您需要特定类型的支票时,您应该考虑使用!=,而不仅仅是“如果不是”类型。