2013-02-19 92 views
2

有人說爆炸!表示方法「可能」修改對象。使用砰砰聲?

在這個例子中:

foo = "A STRING" 
foo.downcase 
puts foo 
# => A STRING 
foo.downcase! 
puts foo 
# => a string 

砰符號似乎引起的副作用。是obj.method!相當於obj = obj.method?如果不是,爲什麼?有兩種表達方式不對等的方法嗎?

+0

您是否問爆炸方法在功能上等同於重新分配?在大多數情況下,可能是的,但它確實取決於方法。 – 2013-02-19 01:14:52

+0

@ZachKemp是的,這正是我所要求的。 – Tom 2013-02-19 01:16:16

+1

爆炸是函數名稱的一部分。它只是方法名稱的一部分。 – 2013-02-19 01:21:59

回答

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. 

所有這些都只是命名約定,在開發商已經選擇以提供兩個類似命名的方法。

+0

純粹是一種命名約定?爆炸影響對象是否被修改。這就是我所說的:https://gist.github.com/twslankard/4982278 – Tom 2013-02-19 01:19:52

+1

@Tom不,不會影響對象是否被修改:它是*命名約定*。例如,Rails的「save」與「save!」。 – 2013-02-19 01:20:54

+0

有些方法只有一個爆炸版本才能表明它們執行某種不可逆轉的操作(例如ActiveRecord的'readonly!')。 – Chuck 2013-02-19 01:21:11

相關問題