我完全没有使用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或空的方式是不正确的?
答案 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
表达式的错误。