使用或运算符检查单个行中的变量是否为空或为空

时间:2014-05-20 05:12:10

标签: ruby

我完全没有使用Ruby的经验,但我正在尝试调试FPM中的问题。有时,在运行FPM时,我得到以下堆栈跟踪:

output': undefined method `empty?' for nil:NilClass (NoMethodError)

我将此错误追溯到此行(rpm.rb, line 419):

if @epoch.nil? or @epoch.empty?
   @logger.warn("no value for epoch is set, defaulting to nil")
   return nil
end

This blog post说明了or运算符:

  

考虑用或构建的链条的最佳方式   一系列的后备:尝试这个,如果失败尝试这个,依此类推

这让我相信在上面的代码片段中,如果epoch.nil?的计算结果为true,它将不会尝试检查epoch.empty?,但是一个简单的键盘显示错误({{3 }})

str = nil
puts str.nil? or str.empty?

Output:
Line 2: undefined method `empty?' for nil:NilClass (NoMethodError)
true

如果我将操作符更改为||,则短路工作正常 - 如果epoch.nil?评估为true,则不会尝试评估epoch.empty?

我误解了or运算符的某些内容吗? FPM检查nil或空的方式是不正确的?

2 个答案:

答案 0 :(得分:3)

您可以通过注意nil.to_s is an empty string

来跳过整个问题
  

NilClass#to_s→“”

     

始终返回空字符串。

鉴于此,您可以说:

if @epoch.to_s.empty?

这是一个有用的技巧,可以在处理字符串时避免一堆嘈杂的nil?测试。

答案 1 :(得分:2)

这是运营商优先权的问题。 ||的优先级高于or。 你应该写它:

str = nil
puts (str.nil? or str.empty?)
puts str.nil? || str.empty?

Difference between "or" and || in Ruby?

中查看详情

对于FPM的问题,我在Ruby 1.8.6,1.9.3,2.0.0下尝试过,并没有得到or表达式的错误。