Rubyメソッドで感嘆符が使用されるのはなぜですか?



Why Are Exclamation Marks Used Ruby Methods



ルビー 一部の方法では、疑問符(?)があり、次のように質問しますinclude?このような問題include?問題のオブジェクトが含まれているかどうかを確認してから、true / falseを返します。

しかし、なぜ一部のメソッドには感嘆符(!)があり、他のメソッドには感嘆符がないのですか?



どういう意味ですか?


#1階

簡単な説明:



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!新しい文字列オブジェクトを返しませんが、文字列を完全に置き換えますfoo小文字に変更します。使用しないことをお勧めしますdowncase!どうしても必要な場合を除きます。


#2階

最も正確な方法はBangを使用することです!もっと 危険 以上 驚くべき バージョン。たとえば、Bangなしで変更する方法はたくさんあります。 .destroy そして、通常の方法は、コアライブラリ内のより安全な代替方法の爆発的な増加にすぎません。

たとえば、アレイには.compact with .compact!があります。 、どちらの方法でも配列が変更されますが、.compact!配列にnilがない場合は、selfではなくnilが返されます。これは、selfを返すよりも驚くべきことです。



爆発の唯一の非変異法はKernel ofであることがわかりました .exit! これは.exitよりも優れています。プロセスが閉じられたときにキャプチャできないため、さらに驚くべきことですSystemExit

RailsとActiveRecordは、次のようなより多くの「驚くべき」効果を使用するため、この傾向を続けています。 .create! これにより、失敗時にエラーが発生します。


#3階

結論:!メソッドは、呼び出されたオブジェクトの値を変更するだけで、メソッドはありません!メソッドを呼び出したオブジェクトに書き込まずに、操作された値を返します。

使用するだけです!変数に元の値を格納する必要がない場合は、メソッドを呼び出します。

私は次のようなことをするのが好きです:

foo = 'word' bar = foo.capitalize puts bar

または

foo = 'word' puts foo.capitalize

代わりに

foo = 'word' foo.capitalize! puts foo

元の値に再度アクセスしたい場合に備えて。


#4階

!

これは爆発的な変化だと思います。それ以前のすべてが破壊されます。感嘆符または感嘆符は、コードに永続的な変更を加えたことを示します。

グローバル置換にRubyメソッドを使用する場合gsub!あなたが行う交換は永久的です。

想像できるもう1つの方法は、テキストファイルを開いて検索して置換し、保存することです。!コードでも同じことを行います。

bashの世界から来た場合、もう1つの便利なヒントはsed -i同様の効果で、変更を永続的に保存できます。


#5階

「破壊的方法」として知られているそれらは、あなたが参照するオブジェクトの元のコピーを変更する傾向があります。

numbers=[1,0,10,5,8] numbers.collect puts n*2 # would multiply each number by two numbers #returns the same original copy numbers.collect!n # would multiply each number by two and destructs the original copy from the array numbers # returns [nil,nil,nil,nil,nil]

#6階

通常、メソッドは終了します!メソッドが 呼び出すオブジェクトを変更します 。 Rubyはこれらを 'と呼びます 危険な方法 '彼らは他の人が参照するかもしれない状態を変えるからです。これは文字列の簡単な例です。

foo = 'A STRING' # a string called foo foo.downcase! # modifies foo itself puts foo # prints modified foo

これは出力します:

a string

標準ライブラリには、同じような名前のメソッドのペアが表示される場所がたくさんあります。1つは!です。誰も。そうでないものは「安全な方法」と呼ばれ、元に戻ります sコピー 、コピーに適用された変更が呼び出し先によって変更されていない場合。これは!なしの同じ例です:

foo = 'A STRING' # a string called foo bar = foo.downcase # doesn't modify foo returns a modified string puts foo # prints unchanged foo puts bar # prints newly created bar

この出力:

A STRING a string

これは単なる慣例ですが、多くのRubyクラスがこれに従っていることを忘れないでください。また、コードで何が変更されたかを追跡するのにも役立ちます。


#7階

!通常、メソッドが結果を返すのではなく、オブジェクトに作用することを意味します。から Rubyプログラミング

「危険」またはレシーバーを変更する方法は、末尾の「!」にちなんで名付けられる場合があります。


#8階

この命名規則は、 スキーム

1.3.5命名規則

慣例により、常にブール値を返すプロシージャ名は通常、「?」で終わります。このようなプロセスは述語と呼ばれます。

慣例により、以前に割り当てられた場所(セクション3.4を参照)に値を格納するプロシージャ名は、通常、「!」で終わります。このようなプログラムは、突然変異プログラムと呼ばれます。慣例により、ミューテーションプロセスによって返される値は指定されていません。


#9階

感嘆符は、「これは危険です。注意してください」を除いて、多くのことを意味します。場合によっては、感嘆符から多くを得ることができません。

他の人が言っているように、標準のメソッドでは、通常、オブジェクトがそれ自体を変異させるメソッドを表すために使用されますが、常にそうであるとは限りません。多くの標準的なメソッドはレシーバーを変更し、感嘆符はありません(popshiftclear)。感嘆符のあるメソッドの中にはレシーバーを変更しないものもあります(exit!)。たとえば、を参照してください この記事

他のライブラリは異なる方法を使用する場合があります。 Railsでは、感嘆符は通常、メソッドがサイレントに失敗するのではなく、失敗したときに例外をスローすることを意味します。

これは命名規則ですが、多くの人が微妙な方法で使用しています。独自のコードでは、メソッドが「危険な」操作を実行する場合、特に同じ名前のメソッドが2つあり、一方のメソッドが他方よりも「危険」である場合に、これを使用することをお勧めします。 「危険」はほとんど何でも意味します。


#10階

thermomorohoax.comから:

私の個人的な好みによると、爆発は次のように使用できます。

1)メソッドが期待どおりに実行されない場合、アクティビティ記録メソッドはエラーを引き起こします。

2)レコードを保存するアクティビティレコードメソッドまたはオブジェクト(ストリップなど)を保存するメソッド

3)場所への投稿やアクションの実行など、「余分な」ことを行う1つの方法。

重要なのは、本当に必要かどうかを考えるときは、他の開発者のトラブルを避けるために大きな音を使用し、爆発の理由を確認する必要があるということです。

爆発は他の開発者に2つの手がかりを提供しました。

1)メソッドを呼び出した後にオブジェクトを保存する必要はありません。

2)メソッドを呼び出すと、dbが変更されます。

http://www.themomorohoax.com/2009/02/11/when-to-use-a-bang-exclamation-point-after-rails-methods