我认为按惯例,只有带感叹号的方法会改变对象。
> array = [1, 2, 3]
=> [1, 2, 3]
> array.pop
=> 3
> array
=> [1, 2]
为什么Array
的{{1}}方法不是pop
?
答案 0 :(得分:11)
这不太正确。
潜在“危险”方法的名称(即修改self或参数的方法,退出!(不会像退出一样运行终结器等),如果存在感叹号,应以感叹号结尾该危险方法的安全版本。
pop方法的名称恰好说明了它的作用,因此无需用感叹号对其进行签名。
答案 1 :(得分:2)
“第二个约定是任何名称以感叹号结尾的方法都应谨慎使用。(...)通常,以感叹号结尾的方法是 mutators ,这会改变一个对象的内部状态。但情况并非总是如此;有许多不以感叹号结尾的变异器,以及一些非变形器的变异器。变异方法(如Array.fill
)不是有非变异的变体通常没有感叹号(原文如此)。“
(Ruby Programming Language,Flanagan& Matsumoto,第180页)
本书继续使用示例exit
与exit!
(两种非突变; exit!
跳过所有at_exit挂钩。)
答案 2 :(得分:1)
这个约定仍然有效,但pop
是所有堆栈实现中众所周知的方法,如果你从堆栈中pop
有效删除它。
这只是数据结构中的常识,红宝石家伙只是错过了添加!
符号。