2

有人说 bang!表示方法“可能”修改对象。

在这个例子中:

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

爆炸符号似乎引起了副作用。obj.method!相当于obj = obj.method?_ 如果不是,为什么?有没有这两个表达式不等价的方法?

4

1 回答 1

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.

所有这些都只是命名约定,开发人员选择提供两个名称相似的方法。

于 2013-02-19T01:16:08.533 回答