在Ruby中,对于以问号结尾的方法名称的真实性是惯用性吗?
-
28-09-2019 - |
题
具有问号的方法是返回真相(例如,数字)的方法是正常的 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?
设置的方法。