在Ruby中,有些方法带有问号(?),会问include?询问是否包含有问题的对象,然后返回true/false。
但是为什么有些方法有感叹号(!)而其他方法没有呢?
这是什么意思?
在Ruby中,有些方法带有问号(?),会问include?询问是否包含有问题的对象,然后返回true/false。
但是为什么有些方法有感叹号(!)而其他方法没有呢?
这是什么意思?
当前回答
感叹号意味着很多事情,有时你除了“这很危险,小心”外,你无法从它身上看出很多东西。
正如其他人所说,在标准方法中,它通常用于指示导致对象自身变异的方法,但并不总是如此。请注意,许多标准方法更改了它们的接收器,并且没有感叹号(pop、shift、clear),并且一些带有感叹号的方法不更改它们的接收器(exit!)。例如,请参阅这篇文章。
其他库可能以不同的方式使用它。在Rails中,感叹号通常意味着该方法将在失败时抛出异常,而不是无声地失败。
这是一种命名惯例,但许多人以微妙的不同方式使用它。在你自己的代码中,一个好的经验法则是当一个方法做了一些“危险”的事情时使用它,特别是当存在两个同名的方法,其中一个比另一个更“危险”时。“危险”几乎可以指任何事情。
其他回答
从themomorohoax.com:
刘海有以下几种用法,依我个人喜好而定。
如果活动记录方法没有这样做,则会引发错误 就像它说的那样。 活动记录方法保存记录或方法保存 对象(例如strip!) 方法做一些“额外的”事情,比如张贴到某个地方 一些行动。
关键是:只有在你真正想过是否要使用爆炸的时候 这是必要的,可以省去其他开发人员不得不这样做的烦恼 检查你为什么要使用爆炸声。
爆炸为其他开发者提供了两个线索。
方法调用后,没有必要保存对象 方法。 当你调用这个方法时,db会被改变。
这个命名约定来自Scheme。
1.3.5命名约定 按照惯例,程序的名称 总是返回一个布尔值 通常以“?”结尾。这样的程序 称为谓词。 按照惯例,程序的名称 存储值到先前 已分配的位置(见3.4节) 通常以“!”结尾。这样的程序 叫做变异程序。通过 方法返回的值 突变过程未指明。
我的回答解释了在Ruby on Rails (RoR)模型验证上下文中带有感叹号/shebangs的Ruby方法的重要性。
本质上,无论何时开发人员定义模型验证(此处解释),他们的最终目标都是拒绝数据库记录更改,并在提交了无效数据以更新相关记录的情况下引发/抛出相关异常。
RoR ActiveRecord gem定义了各种模型操作方法(Ruby on Rails指南)。在这些方法中,有效的?方法是唯一一个无需数据库操作/修改就能触发验证的方法。其余的方法尝试更改数据库。
这些方法在运行时触发回调。列表中的一些方法有一个带shebang的姐妹方法。这两者之间有什么区别?它与记录验证失败时返回的回调形式有关。
不带感叹号/shebang的方法在记录验证失败时只返回布尔值false,而带shebang的方法会引发/抛出异常,然后可以在代码中适当地处理。
它是最准确的说,方法与Bang!是更危险或更令人惊讶的版本。有很多方法在没有Bang的情况下会发生突变,比如.destroy,通常情况下,方法只有Bang,而核心库中存在更安全的替代方法。
例如,在Array中,我们有.compact和.compact!,这两个方法都会改变数组,但是.compact!如果数组中没有nil则返回nil而不是self,这比只返回self更令人惊讶。
我发现唯一的非突变方法是Kernel的.exit!这比.exit更令人惊讶,因为你无法在进程关闭时捕获SystemExit。
Rails和ActiveRecord延续了这一趋势,因为它使用bang来实现更多“令人惊讶”的效果,如.create!这会在失败时产生错误。
! 通常意味着方法作用于对象而不是返回结果。摘自《Programming Ruby》一书:
“危险的”或修改接收者的方法可能会以“!”结尾命名。