有问号的布尔方法的Ruby约定是否有任何例外(?)

时间:2014-04-22 02:34:57

标签: ruby-on-rails ruby

对于返回布尔值的方法,在?中结束调用似乎很正常,但在某些代码中,我发现这并不是一贯的。例如,createsave等某些功能没有?最后在我看过的一些代码中。

这是不好的做法/不一致。它应该在返回布尔值的任何地方吗?还是偶尔会遗漏?

2 个答案:

答案 0 :(得分:5)

ActiveRecord save方法不会提出问题,它只是执行操作并返回所请求操作的状态。返回值(即状态)是布尔值是无关紧要的。

Array#include?String#start_with?等方法确实会提出问题,因此他们的名字后面会有?个后缀。

因此,返回值不是决定方法名称是否以问号结尾,而是方法的意图:如果调用方法主要是询问是/否问题,那么它会得到一个问号;如果调用该方法主要执行其他操作,那么即使它恰好返回一个布尔值,它也不会得到问号。


当然,现实并非那么简单。

File.size?返回nilInteger并进一步混淆问题,还有File.size返回Integer。这两个都提出了一个问题 - “名称 X 的文件大小是多少?” - 唯一的区别是File.size?如果文件不存在或者大小为零(叹气)则返回nil,而File.size对于不存在的文件没有指定的行为。然后File#size(但没有File#size?)作为同一类的实例方法,File#size询问与File.sizeFile.size?相同的问题,但毫无疑问标记

然后在Float结束我们:

  • infinite?提出是/否问题但返回nil-1+1
  • nan?zero?提出是/否问题并返回truefalse

还有其他示例(例如奇怪命名的defined?运算符,Set#add? vs Set#addSet#delete? vs Set#delete,...)其中a ? - 方法不返回布尔值,但它们是异常并且突出,因为它们与通常的核心行为不一致。

我们甚至可以提出attr_reader。如果你说:

attr_reader :pancakes

然后你得到一个pancakes方法,你可以用它来提出问题“pancakes属性的价值是多少?”。请注意,您没有获得pancakes?方法来提出问题,只需获得pancakes访问方法。

核心中? - 方法的行为有些不一致,但数字强烈倾向于“回答”是或否答案“的问题。就非核心代码而言,人们可以做任何他们想做的事情,所以毫无疑问,那里存在巨大的不一致。

答案 1 :(得分:0)

我认为惯例是使用" ?"如果你只是要查询某些事情是否属实。

例如:

def is_a_jerk?(user)
  user == "nPn" ? true : false
end

而像save这样的东西如果成功则会返回true,但如果没有则会返回false。