我认为按照惯例,只有带有感叹号的方法才会改变对象。
> array = [1, 2, 3]
=> [1, 2, 3]
> array.pop
=> 3
> array
=> [1, 2]
为什么不调用Array
's方法?pop
pop!
我认为按照惯例,只有带有感叹号的方法才会改变对象。
> array = [1, 2, 3]
=> [1, 2, 3]
> array.pop
=> 3
> array
=> [1, 2]
为什么不调用Array
's方法?pop
pop!
这不太正确。
如果存在该危险的安全版本,则潜在“危险”方法的名称(即修改 self 或参数的方法,exit!(不像 exit 那样运行终结器)等)应该以感叹号结尾方法。
pop 方法的名称准确地说明了它在做什么,因此无需用感叹号对其进行签名。
“第二个约定是,任何名称以感叹号结尾的方法都应谨慎使用。(...) 通常,以感叹号结尾的方法是mutators,它改变对象的内部状态。但这是并非总是如此;有许多不以感叹号结尾的突变体,以及许多以感叹号结尾的非Array.fill
突变体。没有非突变变体的突变方法(例如 )通常没有感叹号(原文如此)。 "
(Ruby 编程语言,Flanagan 和 Matsumoto,第 180 页)
本书继续以示例exit
与exit!
(均为非变异;exit!
跳过所有 at_exit 挂钩。)
这个约定仍然有效,但pop
它是所有堆栈实现中众所周知的方法,如果您pop
从堆栈中删除某些内容,那么您实际上是在删除它。
这只是数据结构中的常识,ruby 家伙只是错过了添加!
符号。