为什么 Ruby 中的 bang 方法很危险?

Reg*_*gie 3 ruby coding-style naming-conventions

我最近一直在重新学习 Ruby,这个页面说通常 bang 方法是危险的,但没有说明原因。为什么 bang 方法很危险?

Ser*_*sev 6

“危险”在标准库和普通 gem 中有两种广泛的含义:

  1. 方法改变接收者,而不是返回接收者的副本。例子:Array#map!

  2. 如果无法执行其主要功能,方法将引发异常。示例:ActiveRecord::Base#save!, ActiveRecord::Base#create!。如果,比如说,一个对象不能被保存(因为它无效或其他什么),save!将引发一个错误,而save将返回false

我通常在我的代码中为其添加第三种含义:

  1. 方法会立即将数据持久化到数据库中,而不是仅仅更改一些属性并希望稍后有人会保存该对象。示例:假设Article#approve!

  • 还有 `Process::exit!` 跳过运行退出处理程序,而不是正常运行它们的 `Process::exit`。 (2认同)