9

我总是遇到这个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新手

4

6 回答 6

20

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

 if a.try(:value) == false

这是非常干净的。没有try,你可以写

 if a && a.value == false

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

如果有可能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
于 2013-07-25T07:48:54.333 回答
7

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

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

于 2017-05-03T13:44:49.453 回答
2
  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"
于 2013-07-25T07:32:59.663 回答
1

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

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

当然,Rails您可以通过使用blank?present?

于 2016-04-30T22:20:05.027 回答
0

你的条件是多余的。如果a.valuefalse,那就不是nil

if a.nil?.! && a.value == false
  puts "a value is not available"
else
  puts "a value is true"
end
于 2013-07-25T07:36:40.360 回答
0

这将始终返回一个布尔值,如果为 nil,它将返回 false;如果为假,则返回假;如果真返回真。试试看,它又好又短:

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

于 2015-11-17T11:13:26.727 回答