对于返回布尔值的方法,在?中结束调用似乎很正常,但在某些代码中,我发现这并不是一贯的。例如,create
和save
等某些功能没有?最后在我看过的一些代码中。
这是不好的做法/不一致。它应该在返回布尔值的任何地方吗?还是偶尔会遗漏?
答案 0 :(得分:5)
ActiveRecord save
方法不会提出问题,它只是执行操作并返回所请求操作的状态。返回值(即状态)是布尔值是无关紧要的。
Array#include?
或String#start_with?
等方法确实会提出问题,因此他们的名字后面会有?
个后缀。
因此,返回值不是决定方法名称是否以问号结尾,而是方法的意图:如果调用方法主要是询问是/否问题,那么它会得到一个问号;如果调用该方法主要执行其他操作,那么即使它恰好返回一个布尔值,它也不会得到问号。
当然,现实并非那么简单。
File.size?
返回nil
或Integer
并进一步混淆问题,还有File.size
返回Integer
。这两个都提出了一个问题 - “名称 X 的文件大小是多少?” - 唯一的区别是File.size?
如果文件不存在或者大小为零(叹气)则返回nil
,而File.size
对于不存在的文件没有指定的行为。然后File#size
(但没有File#size?
)作为同一类的实例方法,File#size
询问与File.size
和File.size?
相同的问题,但毫无疑问标记
然后在Float
结束我们:
还有其他示例(例如奇怪命名的defined?
运算符,Set#add?
vs Set#add
,Set#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。