EAFP vs LBYL:哪个是比较惯用的Ruby?

Jud*_*eek 3 ruby exception-handling

虽然我可以在Python 上找到有关“ EAFP vs. LBYL ”的大量信息,但我找不到关于Ruby的任何指南。我自己的经验是Ruby至少像Python一样支持异常处理,但是与整个社区相比,我自己的经验简直是九牛一毛。

那么哪种范式更惯用Ruby,EAFP或LBYL?此外,是否有任何重要的性能问题要考虑?

Dav*_*uth 5

Ruby社区对LBYL或EAFP并没有整体的偏爱。它在不同的惯用情况下都使用这两种方法。

Ruby社区实际上并没有使用LBYL或EAFP术语。据我所知,它们仅在Python社区中使用。但是我们可以看看Ruby习惯用法,看看它们如何适应这些术语。

当只有一种可能的例外情况时,例如Array索引超出范围或未定义的Hash键,Ruby几乎总是使用LBYL 。nil在这些情况下返回。nil是一个对象,在条件条件中被视为false,因此在Ruby中检查这些情况的痛苦要小于其他语言。可以通过测试真实性或使用来简洁地处理它们.try

在Ruby中几乎从未看到过的东西(除非它从预先存在的标准中冒出来),是一种C样式的LBYL模式,该模式返回超出范围的值以表示异常情况,例如返回-1表示子字符串为' t包含在字符串中。返回nil使呼叫者更难错过特殊条件。

Ruby更可能使用EAFP

  • 当某些东西只有在发生编程错误时才会失败,例如调用带有错误数量的参数的方法,或者为不满足该方法所期望的接口的方法提供对象(即,没有正确的'鸭型”)。检查这些情况并尝试优雅地处理它们是没有意义的。正确的做法是什么?

  • 当有关于失败失败的复杂信息时,例如File操作或ActiveRecord save!失败的许多方式。

  • raise/ 的远距离特性rescue很有用,例如在ActionController错误处理程序中。

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