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

时间:2010-11-27 01:36:23

标签: ruby idioms truthiness

带问号的方法是否正常返回真实的东西(例如,数字)以表明某些内容是真的,或者true本身应该返回?

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

背景:有人在an answer to a separate question中编写了一个String#int?方法,该方法返回一个表示true的整数,并nil表示false。另一位用户对没有返回布尔值感到惊讶。

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:6)

对于以?结尾的方法,通常返回truefalse,但它不是系统的,并且没有核心方法会假设它。< / p>

核心类中的一个示例是Numeric#nonzero?从不返回truefalse

42.nonzero? # => 42

图书馆Set也有add?delete?。我希望Enumerable#one?返回nilfalse,以区分计数为零的情况和大于1的情况。

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

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

答案 2 :(得分:2)

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

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

但风格上以'?'结尾的方法应返回布尔值truefalse,仅返回布尔值nil或{{1}}。

有问题的方法并没有真正符合我们的预期,并且失败了POLS(“最少意外的原则”),因为你可以合理地期望返回一个布尔值,并得到一个整数或一个零。当代码失败并出现意外的{{1}}或Fixnum值时,可能会导致代码中出现令人不快的意外。

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

答案 3 :(得分:2)

我重新命名了相关方法以删除?,这对于正在回答的问题并不重要。扫描结束的核心函数,我发现返回的数据或nil只是Set上的add?delete?方法。