具有问号的方法是返回真相(例如,数字)的方法是正常的 true 本身被返回?

例如,Ruby Standard库中是否有任何真实性的例子,也可以使用Rails?

背景: 有人写了一个 String#int? 方法IN 一个单独问题的答案, ,返回一个整数以表示真实,并且 nil 代表错误。另一个用户对不返回布尔值感到惊讶。

有帮助吗?

解决方案

这是 通常 对于以 ? 返回 true 或者 false 但这不是系统的,没有核心方法会假设。

核心类中的一个示例是 Numeric#nonzero? 哪一个 绝不 返回 true 或者 false.

42.nonzero? # => 42

图书馆 Set 拥有 add?delete? 也。我希望 Enumerable#one? 回来 nil 或者 false 将计数为零的情况区分出大于一个的情况。

类似的例子是比较操作员(<, >, ,...),通常只返回 true 或者 false. 。这里再次存在异常 Module将返回的运营商 nil 相反,当两个模块无关时:

Array > Enumerable  # => false
Array > Fixnum      # => nil

其他提示

添加?对于Ruby中的方法名称是惯用方法的,该方法将返回真或错误。 对象#nil? 是一个很好的例子。实际上,对象有很多真实检查的很好的例子。

您的问题有两个答案,两者都是有效的:

从技术上讲,任何返回的东西 false 或者 nil 进行有条件测试时的价值作为虚假布尔值,就像非nil或 true 价值是真实的。因此,所讨论的方法在大多数时候都可以正确地工作,您想知道某物是否是整数。

但是从风格上讲,一种以“?”结尾的方法应该返回布尔值 true 或者 false 只有那些。

所讨论的方法并不能真正与我们的期望一起表现出色,并且使POLS失败(“最小令人惊讶的原理”),因为您可以合理地期望将布尔值返回,并获得整数或零。当它失败时,这可能会导致代码失败的惊喜 nil 或fixnum值。

因此,虽然这是一种有效的方法,但它不是 好的 方法,我会在代码审查中提出它。这导致了对类似的微妙事物可以增强或伤害代码维护的单独讨论,但这是完全不同的讨论。

我重命名了有关方法以删除 ?, ,这对于要回答的问题并不重要。扫描通过以“核心”结尾的核心函数,我发现返回数据或零的唯一一个是 add?delete? 设置的方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top