我总是遇到这个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
问题是条件语句太笨拙且难以阅读。
如何改进检查nil
和false
条件语句?
谢谢,我是一个Ruby新手
答案 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
答案 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.value
为false
,那么它不会是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