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

Kit*_* Ho 5 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
Run Code Online (Sandbox Code Playgroud)

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

谢谢,我是一个Ruby新手

nat*_*vda 15

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

 if a.try(:value) == false
Run Code Online (Sandbox Code Playgroud)

这很干净.没有try,你可以写

 if a && a.value == false
Run Code Online (Sandbox Code Playgroud)

如果a.value是nil,那不是假的,所以没关系:)

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

if a && a.respond_to?(:value) && a.value == false
Run Code Online (Sandbox Code Playgroud)

[更新:红宝石2.3之后]

从ruby 2.3开始,版本更短:

if a&.value == false
Run Code Online (Sandbox Code Playgroud)

这几乎等同于a.try(:value)(但纯粹的红宝石).区别:

  • 如果value不存在,&.操作员将抛出,try将返回nil(优选与否?)(注意:try!也会抛出).
  • 当级联try&.他们也处理false不同.这遵循以前的差异逻辑,try将返回nil,而&.将抛出因为false没有方法:P


小智 7

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

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