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