在ruby中,truthiness是以问号结尾的方法名的惯用用法吗?
带问号的方法返回真实的东西(例如,一个数字)来表示某个东西是真的,这是正常的吗?还是应该返回在ruby中,truthiness是以问号结尾的方法名的惯用用法吗?,ruby,idioms,truthiness,Ruby,Idioms,Truthiness,带问号的方法返回真实的东西(例如,一个数字)来表示某个东西是真的,这是正常的吗?还是应该返回true本身 例如,在Ruby标准库或Rails中是否有使用truthiness的例子 背景:有人在中编写了一个String#int?方法,该方法返回一个整数表示true,返回nil表示false。另一个用户对没有返回布尔值感到惊讶。添加一个?对于Ruby中的方法名,习惯用法是该方法将返回true或false。这是一个很好的例子。事实上,Object有很多很好的真实性检查示例。您的问题有两个答案,两个答案
true
本身
例如,在Ruby标准库或Rails中是否有使用truthiness的例子
背景:有人在中编写了一个
String#int?
方法,该方法返回一个整数表示true,返回nil
表示false。另一个用户对没有返回布尔值感到惊讶。添加一个?对于Ruby中的方法名,习惯用法是该方法将返回true或false。这是一个很好的例子。事实上,Object有很多很好的真实性检查示例。您的问题有两个答案,两个答案都是有效的:
从技术上讲,任何返回false
或nil
值的内容在执行条件测试时都将作为假布尔值,就像非nil或true
值作为真值一样。因此,当你想知道某个东西是否是整数时,这个方法在大多数情况下都能正常工作
但是在风格上,以“?”结尾的方法应该返回布尔值true
或false
,并且只返回那些值
所讨论的方法并没有很好地满足我们的期望,并且没有通过POLS(“最小意外原则”),因为您可以合理地期望返回一个布尔值,并得到一个整数或零。当代码出现意外的nil
或Fixnum值时,这可能会导致代码中出现令人不快的意外情况
所以,虽然它是一个有效的方法,但它不是一个好方法,我会在代码审查中提出它。这就引出了一个单独的讨论,讨论像这样微妙的事情会如何增强或损害代码维护,但这是一个完全不同的讨论。我重命名了所讨论的方法以删除
?
,这对所回答的问题来说并不重要。通过扫描以?s结尾的核心函数,我发现返回数据或nil的只有Set上的add?
和delete?
方法。通常以?
结尾的方法返回true
或false
,但这是不系统的,没有核心方法会假设它
核心类中的一个例子是Numeric#nonzero?
,它从不返回true
或false
42.nonzero? # => 42
库Set
也有add?
和delete?
。我希望Enumerable#one?
返回nil
或false
以区分计数为零和大于一的情况
一个类似的例子是比较运算符(
,…),它通常只返回true
或false
。在这里,当两个模块不相关时,模块
的运算符将返回nil
,但也存在例外情况:
Array > Enumerable # => false
Array > Fixnum # => nil
您引用的示例没有遵循约定,它应该返回一个实际的布尔值。嘿,我看到了那个讨论,想知道这个回答是否会导致这个问题。:-)接得好@AndrewGrimm@Adam:这不是回答,不是评论吗?(通常我抱怨人们做了相反的事情!)我从你的回答中删除了我的评论:我错了。谢谢你的课!Heckle也在内部使用-IIRC
true
表示一个方法是Heckle-proof的,false
表示它不是,而nil
表示它没有任何东西可以纠结。