使用Ruby 2.4,我的部分内容是“if”语句
row_data.index{|x| DataHelper.my_function(x) } > num_var
不幸的是,如果“row_data.index {| x | DataHelper.my_function(x)}”的计算结果为nil,则上述语句会出错。有没有办法重写上面的内容,如果“row_data.index {| x | DataHelper.my_function(x)}”被评估为nil,它将返回“false”?我不希望将表达式存储在我的“if”语句之前的变量中,因为如果执行没有到达那里,我可能不需要执行该语句。我觉得有一个单行,但我不知道它是什么。
答案 0 :(得分:2)
短路评估是的两个重要原因 {/ 3}。
简单的出路right way checking nil or false conditionals(to_s
,to_i
等)可以暂时避免引发异常/错误,但有时可以玩魔鬼技巧打破您的条件当条件的您的一个比较值来自 - 0
,""
,[]
等时。因此,明确的关注是考虑到你的代码可能会在一段时间后持续时间不够长。
实施例。 - 1
if x.to_i > -1
puts x "is not a negative integer"
else
puts x "is a negative integer"
end
在nil.to_i :=> 0
逻辑检查进入带有转换值的条件块时if x.to_i > -1
获得批准可能会有危险0
nil.to_i
})。
可能你不会介意 ex。 - 1 将nil
打印为:0 is not a negative integer
。怎么样?
if x.to_i
puts " 1/x is" 1/x
end
它可以进一步提升每个x的ZeroDivisionError: divided by 0
nil
,并且在这些情况下您需要额外注意。可能你不想从第一个地方开始在你的街区内招待nil
。
效果和 CLEAN代码是您每次都听到的两个热门词汇。如果先前条件为&&
,则explicit conversions(false
)不会对后续条件感到烦恼,这会使条件执行得更快< / strong>即可。此外,它还可以保护进入条件块的nil
值,并使其更容易受到攻击。
回答您的提问:
if (not row_data.index{|x| DataHelper.my_function(x) }.nil?) && (row_data.index{|x| DataHelper.my_function(x) } > num_var)
# do your if block here
# this keeps nil away
else
puts "row_data.index{|x| DataHelper.my_function(x) } is nil"
end
答案 1 :(得分:1)
您可以利用nil.to_i
返回0
if row_data.index{ |x| DataHelper.my_function(x) }.to_i > num_var
# index is bigger than num_var
else
# index is smaller or equal to num_var
end
根据my_function和num_var的含义,您可能还需要考虑num_var == 0
的情况。