5

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

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

为什么不调用Array's方法?poppop!

4

3 回答 3

11

这不太正确。

来自Ruby 风格指南

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

pop 方法的名称准确地说明了它在做什么,因此无需用感叹号对其进行签名。

于 2012-06-19T20:10:12.420 回答
2

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

(Ruby 编程语言,Flanagan 和 Matsumoto,第 180 页)

本书继续以示例exitexit!(均为非变异;exit!跳过所有 at_exit 挂钩。)

于 2012-06-19T20:37:40.740 回答
1

这个约定仍然有效,但pop它是所有堆栈实现中众所周知的方法,如果您pop从堆栈中删除某些内容,那么您实际上是在删除它。

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

于 2012-06-19T20:00:46.507 回答