带问号的方法是否正常返回真实的东西(例如,数字)以表明某些内容是真的,或者true
本身应该返回?
例如,在Ruby标准库或Rails中是否有使用真实性的例子?
背景:有人在an answer to a separate question中编写了一个String#int?
方法,该方法返回一个表示true的整数,并nil
表示false。另一位用户对没有返回布尔值感到惊讶。
答案 0 :(得分:8)
添加? Ruby中的方法名称是惯用的,该方法将返回true或false。 Object#nil?就是一个很好的例子。事实上,Object有很多关于真实性检查的好例子。
答案 1 :(得分:6)
对于以?
结尾的方法,通常返回true
或false
,但它不是系统的,并且没有核心方法会假设它。< / p>
核心类中的一个示例是Numeric#nonzero?
,从不返回true
或false
。
42.nonzero? # => 42
图书馆Set
也有add?
和delete?
。我希望Enumerable#one?
返回nil
或false
,以区分计数为零的情况和大于1的情况。
类似的示例是比较运算符(<
,>
,...),它们通常只返回true
或false
。这里再次存在Module
运算符的异常,当两个模块不相关时,将返回nil
:
Array > Enumerable # => false
Array > Fixnum # => nil
答案 2 :(得分:2)
您的问题有两个答案,两者都有效:
从技术上讲,返回false
或nil
值的任何内容在进行条件测试时都会作为假布尔值,就像非零或true
值充当true一样。因此,有问题的方法在大多数时候都能正常工作,你想知道某些东西是否为整数。
但风格上以'?'结尾的方法应返回布尔值true
或false
,仅返回布尔值nil
或{{1}}。
有问题的方法并没有真正符合我们的预期,并且失败了POLS(“最少意外的原则”),因为你可以合理地期望返回一个布尔值,并得到一个整数或一个零。当代码失败并出现意外的{{1}}或Fixnum值时,可能会导致代码中出现令人不快的意外。
所以,虽然它是一个有效的方法,但它不是一个好的方法,我会在代码审查中提出它。这导致单独讨论如何微妙的事情可以增强或损害代码维护,但这是一个完全不同的讨论。
答案 3 :(得分:2)
我重新命名了相关方法以删除?
,这对于正在回答的问题并不重要。扫描结束的核心函数,我发现返回的数据或nil只是Set上的add?
和delete?
方法。