在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
表示它没有任何东西可以纠结。