为什么Array的pop方法没有感叹号?

时间:2012-06-19 19:57:49

标签: ruby

我认为按惯例,只有带感叹号的方法会改变对象。

> array = [1, 2, 3]
 => [1, 2, 3] 
> array.pop
 => 3 
> array
 => [1, 2] 

为什么Array的{​​{1}}方法不是pop

3 个答案:

答案 0 :(得分:11)

这不太正确。

来自The Ruby Style Guide

潜在“危险”方法的名称(即修改self或参数的方法,退出!(不会像退出一样运行终结器等),如果存在感叹号,应以感叹号结尾该危险方法的安全版本

pop方法的名称恰好说明了它的作用,因此无需用感叹号对其进行签名。

答案 1 :(得分:2)

“第二个约定是任何名称以感叹号结尾的方法都应谨慎使用。(...)通常,以感叹号结尾的方法是 mutators ,这会改变一个对象的内部状态。但情况并非总是如此;有许多不以感叹号结尾的变异器,以及一些非变形器的变异器。变异方法(如Array.fill)不是有非变异的变体通常没有感叹号(原文如此)。“

(Ruby Programming Language,Flanagan& Matsumoto,第180页)

本书继续使用示例exitexit!(两种非突变; exit!跳过所有at_exit挂钩。)

答案 2 :(得分:1)

这个约定仍然有效,但pop是所有堆栈实现中众所周知的方法,如果你从堆栈中pop有效删除它。

这只是数据结构中的常识,红宝石家伙只是错过了添加!符号。