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

时间:2015-07-06 18:37:27

标签: ruby coding-style naming-conventions

我最近一直在重新学习Ruby,_replace()页面说通常一种爆炸方法很危险,但它并没有说明原因。为什么爆炸方法很危险?

6 个答案:

答案 0 :(得分:3)

您引用的页面包含:

  

通常对于内置类,危险通常(尽管不总是)意味着这种方法与非爆炸等效方法不同,会永久修改其接收器。

答案 1 :(得分:3)

标准库和普通宝石中有两种“危险”的含义:

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

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

  3. 我通常在我的代码中添加第三个含义:

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

答案 2 :(得分:2)

惯例如下:

  • 首先,只有当你有一个同名的非爆炸替代品时,你才能创建一个爆炸方法。
  • 其次 - 是的,这意味着这个版本“更危险”。这是一个非常含糊的术语,就像你自己说的那样。
  • 在很多标准库中,它会修改一个对象,而不是创建一个新对象。如果调用不需要任何修改,有时会返回nil而不是对象。
  • 在rails bang方法中,通常会引发异常,而不是返回nil

答案 3 :(得分:2)

  

为什么爆炸方法很危险?

因为这是命名约定:如果有两种方法可以做同样的事情,那么你可以将它们命名为相同的名称,但更令人惊讶或更危险的方法就是爆炸。

例如,Process::exitProcess::exit!都退出当前运行的Ruby进程,但是bang版本将跳过运行可能安装的所有退出处理程序,因此,例如,跳过任何清理,您可能已安排应用程序何时退出。

答案 4 :(得分:-2)

不,这不危险。 Bang方法只是意味着他们正在修改对象本身,你应该小心。

答案 5 :(得分:-2)

删除我以前的回复,这一直不是真的。 这是一个很好的博客:http://dablog.rubypal.com/2007/8/15/bang-methods-or-danger-will-rubyist