2013-02-19 36 views
2

有人说爆炸!表示方法“可能”修改对象。使用砰砰声?

在这个例子中:

foo = "A STRING" 
foo.downcase 
puts foo 
# => A STRING 
foo.downcase! 
puts foo 
# => a string 

砰符号似乎引起的副作用。是obj.method!相当于obj = obj.method?如果不是,为什么?有两种表达方式不对等的方法吗?

+0

您是否问爆炸方法在功能上等同于重新分配?在大多数情况下,可能是的,但它确实取决于方法。 – 2013-02-19 01:14:52

+0

@ZachKemp是的,这正是我所要求的。 – Tom 2013-02-19 01:16:16

+1

爆炸是函数名称的一部分。它只是方法名称的一部分。 – 2013-02-19 01:21:59

回答

6

砰!在方法名中通常意味着“危险”。

  • 它是一种方法的命名约定,操作,的规则。

  • 这通常意味着警告或突变,或不可逆转,或将引发异常等

我们经常用 “!”作为命名惯例来区分两种类似的方法:

  • 正常的方法名返回结果。

  • “!”方法名称有些危险。

组成“!”的例子,意义突变:

obj.change #=> return a new object that has the change. 
obj.change! #=> do the change by mutating the object. 

编写“!”的例子,意思是“产生错误”:

obj.save #=> if the object can't save, then return false. 
obj.save! #=> if the object can't save, then raise an exception. 

组成“!”的例子,意味着“危险”或“无法挽回”:

obj.exit #=> exit normally, running all exit handlers. 
obj.exit! #=> exit immediately, skipping all exit handlers. 

所有这些都只是命名约定,在开发商已经选择以提供两个类似命名的方法。

+0

纯粹是一种命名约定?爆炸影响对象是否被修改。这就是我所说的:https://gist.github.com/twslankard/4982278 – Tom 2013-02-19 01:19:52

+1

@Tom不,不会影响对象是否被修改:它是*命名约定*。例如,Rails的“save”与“save!”。 – 2013-02-19 01:20:54

+0

有些方法只有一个爆炸版本才能表明它们执行某种不可逆转的操作(例如ActiveRecord的'readonly!')。 – Chuck 2013-02-19 01:21:11

相关问题