Ruby:用于检查nil / false条件语句的干净代码?

时间:2013-07-25 07:31:47

标签: ruby

我总是遇到这个Ruby问题,我想写得更干净。

var a can be nil
a.value can also be nil
a.value has possible true or false value

if (not a.nil?) && (not a.value.nil?) && a.value == false
  puts "a value is not available"
else
  puts "a value is true"
end

问题是条件语句太笨拙且难以阅读。 如何改进检查nilfalse条件语句?

谢谢,我是一个Ruby新手

6 个答案:

答案 0 :(得分:13)

Ruby on rails有一个名为try的扩展名,允许你编写:

 if a.try(:value) == false

非常干净。没有try,您只需编写

即可
 if a && a.value == false

如果a.value为零,则不是假的,所以没关系:)

如果可能没有定义a.value(会引发异常),我会写如下:

if a && a.respond_to?(:value) && a.value == false

[更新:红宝石2.3之后]

从ruby 2.3开始,版本更短:

if a&.value == false

几乎相当于a.try(:value)(但纯粹的红宝石)。差异:

  • 如果value不存在,&.运算符将抛出,try将返回nil(优选与否?)(注意:try!也会抛出) 。
  • 当级联try&.时,他们也会以不同的方式处理false。这遵循以前的差异逻辑,try将返回nil,而&.将抛出,因为false不知道任何方法:P

答案 1 :(得分:6)

您可以使用安全导航操作员(&.)以更紧凑的方式实现它: if a&.value == false

来源:http://mitrev.net/ruby/2015/11/13/the-operator-in-ruby/

答案 2 :(得分:1)

  if a && a.value!=false
     puts "a value is true"
  else
     puts "a value is not available"         
  end


  or just 

  puts a && a.value!=false ? "a value is true" : "a value is not available"

答案 3 :(得分:1)

最简单,最干净的方法是将其翻转并反转。检查truthy值而不是falsey

if a && a.value
  puts "a value is true"
else
  puts "a value is not available"
end

当然在Rails您可以使用blank?present?

进行操作

答案 4 :(得分:0)

你的情况多余。如果a.valuefalse,那么它不会是nil

if a.nil?.! && a.value == false
  puts "a value is not available"
else
  puts "a value is true"
end

答案 5 :(得分:0)

这将始终返回一个布尔值,如果为nil则返回false;如果为false则返回false;如果true返回true。尝试一下,它很好而简短:

!!a.try(:value) == false