有些人说爆炸!
表示方法“可能”修改对象。
在这个例子中:
foo = "A STRING"
foo.downcase
puts foo
# => A STRING
foo.downcase!
puts foo
# => a string
爆炸符号似乎引起副作用。 obj.method!
是否等同于obj = obj.method
?如果没有,为什么?是否存在这两种表达式不相等的方法?
答案 0 :(得分: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.
所有这些只是命名约定,开发人员选择提供两个同名的方法。