在Ruby中,有些方法带有问号(?),会问include?询问是否包含有问题的对象,然后返回true/false。

但是为什么有些方法有感叹号(!)而其他方法没有呢?

这是什么意思?


当前回答

从themomorohoax.com:

刘海有以下几种用法,依我个人喜好而定。

如果活动记录方法没有这样做,则会引发错误 就像它说的那样。 活动记录方法保存记录或方法保存 对象(例如strip!) 方法做一些“额外的”事情,比如张贴到某个地方 一些行动。

关键是:只有在你真正想过是否要使用爆炸的时候 这是必要的,可以省去其他开发人员不得不这样做的烦恼 检查你为什么要使用爆炸声。

爆炸为其他开发者提供了两个线索。

方法调用后,没有必要保存对象 方法。 当你调用这个方法时,db会被改变。

其他回答

从themomorohoax.com:

刘海有以下几种用法,依我个人喜好而定。

如果活动记录方法没有这样做,则会引发错误 就像它说的那样。 活动记录方法保存记录或方法保存 对象(例如strip!) 方法做一些“额外的”事情,比如张贴到某个地方 一些行动。

关键是:只有在你真正想过是否要使用爆炸的时候 这是必要的,可以省去其他开发人员不得不这样做的烦恼 检查你为什么要使用爆炸声。

爆炸为其他开发者提供了两个线索。

方法调用后,没有必要保存对象 方法。 当你调用这个方法时,db会被改变。

! 通常意味着方法作用于对象而不是返回结果。摘自《Programming Ruby》一书:

“危险的”或修改接收者的方法可能会以“!”结尾命名。

简单的解释:

foo = "BEST DAY EVER" #assign a string to variable foo.

=> foo.downcase #call method downcase, this is without any exclamation.

"best day ever"  #returns the result in downcase, but no change in value of foo.

=> foo #call the variable foo now.

"BEST DAY EVER" #variable is unchanged.

=> foo.downcase! #call destructive version.

=> foo #call the variable foo now.

"best day ever" #variable has been mutated in place.

但是如果你曾经用downcase来调用一个方法!在上面的解释中,foo将永久地更改为downcase。downcase !不会返回一个新的字符串对象,而是在适当的位置替换字符串,完全将foo更改为downcase。 我建议你不要用小写!除非完全有必要。

提醒一下,因为我自己也经历过。

在Ruby中,!改变对象并返回它。否则它将返回nil。

因此,如果你正在对一个数组进行某种操作,并调用方法.compact!没有东西要压缩,它会返回nil。

例子:

arr = [1, 2, 3, nil]
arr.compact!
=> [1, 2, 3]

Run again arr.compact!
=> nil

如果你需要在一行中使用数组arr,最好再次显式返回它,否则你将得到nil值。

例子:

arr = [1, 2, 3]
arr.compact! => nil
arr # to get the value of the array

它是最准确的说,方法与Bang!是更危险或更令人惊讶的版本。有很多方法在没有Bang的情况下会发生突变,比如.destroy,通常情况下,方法只有Bang,而核心库中存在更安全的替代方法。

例如,在Array中,我们有.compact和.compact!,这两个方法都会改变数组,但是.compact!如果数组中没有nil则返回nil而不是self,这比只返回self更令人惊讶。

我发现唯一的非突变方法是Kernel的.exit!这比.exit更令人惊讶,因为你无法在进程关闭时捕获SystemExit。

Rails和ActiveRecord延续了这一趋势,因为它使用bang来实现更多“令人惊讶”的效果,如.create!这会在失败时产生错误。