在ruby中,对于以问号结尾的方法名称,是否是真实的惯用语?

带有问号的方法返回一些真实的东西(例如,一个数字)来表示某些东西是真的,或者它本身应该返回,这是正常的吗?

例如,有没有在Ruby标准库或Rails中使用真实性的例子?

背景:有人写了一个String#int? 回答单独问题的方法 ,返回一个表示true的整数, nil表示false。 另一位用户对没有返回布尔值感到惊讶。

方法通常?结尾? 返回truefalse但它不是系统的,没有核心方法会假设它。

核心类中的一个例子是Numeric#nonzero? 永远不会返回truefalse

 42.nonzero? # => 42 

Setadd?delete? 太。 我希望Enumerable#one? 返回nilfalse以区分计数为零的情况和大于1的情况。

类似的例子是比较运算符( <> ,...),它们通常只返回truefalse 。 这里同样存在Module运算符的exception,当两个模块不相关时,它们将返回nil

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

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

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

从技术上讲,返回falsenil值的任何内容在进行条件测试时都会作为假布尔值,就像非零值或true值作为true一样。 因此,有问题的方法在大多数时候都能正常工作,你想知道某些东西是否为整数。

但风格上以’?’结尾的方法 应该返回布尔值truefalse ,只返回那些。

所讨论的方法并没有真正符合我们的预期,并且失败了POLS(“最少惊喜原则”),因为您可以合理地期望返回布尔值,并获得整数或零。 当代码失败并出现意外的nil或Fixnum值时,可能会导致令人不快的意外惊喜。

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

我重命名了有问题的方法来删除? ,对于正在回答的问题,这真的不重要。 扫描结束的核心function,我发现返回数据或nil的唯一内容是add?delete? Set上的方法。