我以为按照惯例,只有带有感叹号的方法才能改变物体。
> array = [1, 2, 3]
=> [1, 2, 3]
> array.pop
=> 3
> array
=> [1, 2] 为什么Array**'s** pop pop!**?**方法不是方法?
发布于 2012-06-19 20:10:12
这并不完全正确。
来自红宝石风格指南
潜在“危险”方法的名称(即修改自我或参数的方法,退出!)(不像exit那样运行终结器),等等。如果存在安全版本的危险方法__,则应以感叹号结尾。
pop方法的名称准确地说明了它所做的事情,因此没有必要用感叹号对其进行签名。
发布于 2012-06-19 20:37:40
“第二个惯例是,任何以感叹号结尾的方法都应该谨慎使用。(.)通常,以感叹号结尾的方法都是变异器,它会改变对象的内部状态。但情况并不总是这样;有许多变异器不以感叹号结尾,也有许多非变异符没有变化。变异方法(例如Array.fill)通常没有感叹号(Sic)。”
( Ruby编程语言,Flanagan &Matsumoto,第180页)
本书接着介绍了exit与exit! (两者都不变异;exit!跳过所有at_exit钩子)的例子。
发布于 2012-06-19 20:00:46
这个约定仍然有效,但是pop是所有堆栈实现中的一个众所周知的方法,如果您从堆栈中删除了一些东西,那么您将有效地删除它。
这只是数据结构中的常识,红宝石人只是错过了在其中添加!标志。
https://stackoverflow.com/questions/11108432
复制相似问题