虽然我可以在“EAFP与LBYL”上找到很多关于Python的内容,但我找不到Ruby的任何指南。我自己的经验是Ruby至少和Python一样支持异常处理,但与整个社区相比,我自己的经验是昙花一现。
那么哪种范式更像是惯用的Ruby,EAFP还是LBYL?此外,是否有任何重大的性能问题需要考虑?
答案 0 :(得分:5)
Ruby社区对LBYL或EAFP没有整体偏好;它在不同的习惯用法中使用它们。
Ruby社区实际上并没有使用术语LBYL或EAFP;据我所知,他们只在Python社区中使用过。但我们可以看看Ruby的习语,看看它们是如何适合这些术语的。
当只有一种可能的异常情况时,Ruby几乎总是使用LBYL,例如Array
索引超出界限或未定义Hash
键。在这些情况下会返回nil
。 nil
是一个对象,在条件句中被视为false,因此在Ruby中比在其他语言中检查这些情况要少一些;可以通过测试真实性或使用.try
来简洁地处理它们。
Ruby中几乎从未见过的东西(除非它从先前存在的标准中冒出来)是C风格的LBYL模式,它返回超出范围的值以指示异常情况,如返回-1表示a子字符串不包含在字符串中。返回nil
会使调用者更难以错过异常情况。
Ruby更有可能使用EAFP
当某些内容仅在出现编程错误时失败,例如调用具有错误参数数量的方法或向不满足该方法所期望的接口的方法提供对象(即没有正确的鸭子类型')。检查这些情况并试图优雅地处理它们是没有意义的;什么是正确的做法?
当有关于无法返回的复杂信息时,例如File
操作或ActiveRecord save!
可能失败的多种方式。
当raise
/ rescue
的远程特性有用时,就像在ActionController错误处理程序中一样。
这些样式的相对性能在绝大多数Ruby程序中都不是问题。