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

use*_*541 0 ruby ruby-on-rails

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

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

mu *_*ort 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.size,File.size?但没有问号.

然后Float我们有:

  • infinite?和其他一些提问但没有nil后缀的方法.
  • -1其要求是/否的问题,但回报+1,nan?zero?.
  • truefalse询问是/否问题并返回defined?Set#add?.

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

我们甚至可以提起pancakes.如果你说:

attr_reader :pancakes
Run Code Online (Sandbox Code Playgroud)

然后你得到一个pancakes?方法,你可以用来问" pancakes财产的价值是多少?".请注意,您没有获得问题的?方法,您只需获得一个save访问器方法.

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

  • 以`?`结尾的方法甚至不总是返回一个布尔值,有时它们返回例如`nil`或者除了`true`之外的其他真实的东西.重要的部分是"提问"部分,而不是该方法是否只返回两个特殊对象`true`和`false`.它不是方法而是运算符,所以它不适合100%的问题,但是在一些Ruby实现中,一元前缀`defined?`运算符返回一个字符串,描述你要问的实体类型,例如`'local-变量'`或''方法'`和否则为'nil`.它永远不会返回`true`或`false`. (4认同)