有一种情况,我在nil
调用方法时不同意提出错误。
这是Datetime.strftime
方法。实际上,它应该将Datetime
对象格式化为字符串。
然后有理由
datetime = Time.now
datetime.strftime('%d-%m-%Y') # => '17-10-2014'
datetime = nil
datetime.strftime('%d-%m-%Y') # => ''
相反,我总是需要写:
datetime.strftime('%d-%m-%Y') if datetime
这是一种痛苦。
我理解在nil上调用一个方法可能会导致许多意外行为,因此需要中断,但在这种情况下,我没有看到太多危险。无论如何都会返回一个字符串,结果是相当逻辑的:(empty_date).to_s => empty_string。
我可以避免这种行为吗?
答案 0 :(得分:3)
我不同意你的意见。
在无保护的代码中,具有调用它的方法的nil值几乎总是正常程序流的异常,或者是未经充分验证的条件。
我不明白为什么你的特定案例应被视为例外。你的值是零,你试图调用一个不存在的方法。 QED。
答案 1 :(得分:1)
在 6 年后的 Rails 上下文中,我将使用 try
方法,它使用这种方式:
datetime = Time.now
datetime.try(:strftime, '%d-%m-%Y') # => '25-02-2021'
datetime = nil
datetime.try(:strftime, '%d-%m-%Y') # => nil
答案 2 :(得分:0)
您可以在nil上定义strftime:
class NilClass
def strftime(_)
''
end
end
puts nil.strftime('whatever').inspect
=> ""