EAFP和LBYL:哪种更符合Ruby的惯用法?

4
虽然我可以在 Python 中找到大量关于“EAFP vs. LBYL”的内容,但我找不到任何适用于 Ruby 的指南。我的经验是,Ruby 至少和 Python 一样支持异常处理,但与整个社区相比,我的经验微不足道。
那么,哪种范式更符合 Ruby 的习惯用语,EAFP 还是 LBYL?此外,是否有任何重要的性能问题需要考虑?
1个回答

5
Ruby社区并没有对LBYL或EAFP有整体偏好,而是根据不同的惯用语境使用这两种方法。
据我所知,Ruby社区实际上并不使用LBYL或EAFP这些术语,它们只在Python社区中使用。但是我们可以看一下Ruby惯用语境,并了解它们如何适应这些术语。
当只存在一个可能的异常情况时,例如Array索引超出范围或未定义的Hash键等情况,Ruby几乎总是使用LBYL,返回nil。在条件中,nil被视为false,因此在Ruby中检查这些情况比其他一些语言更容易处理;可以通过测试真实性或使用.try来简洁地处理它们。
在Ruby中,我们几乎从不看到C风格的LBYL模式(除非它沿用了现有标准),即返回越界值以指示异常情况,例如返回-1以指示子字符串未包含在字符串中的情况。返回nil使调用者更难忽略异常条件。
在以下情况下,Ruby更有可能使用EAFP:
  • 仅当存在编程错误时才会失败,例如用错误数量的参数调用方法或向不满足方法所需接口(即没有正确的“鸭子类型”)的方法提供对象。检查这些情况并试图优雅地处理它们没有意义;那么应该做什么是正确的?

  • 当存在有关失败的复杂信息时,例如File操作或ActiveRecord save!可能失败的多种方式。

  • raise/rescue的远程性质有帮助时,如ActionController错误处理程序。

在绝大多数Ruby程序中,这些风格的相对性能不是问题。

我要删除我的回答,因为很明显我是错误的。 - max pleaner
不错的回答,@DaveSchweisguth。虽然我希望您不介意在接受之前等一会儿。我确实注意到 Ruby 社区不使用那些术语,这就是为什么我被迫提出我的问题的原因。 - Judah Meek
@maxpleaner,我希望你把你的答案留下来,这样我就可以给你点赞了,感激你的努力。:C 不过我相信我们以后还会见面的。 :) - Judah Meek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接