5

慣例により、感嘆符の付いたメソッドのみがオブジェクトを変更すると思いました。

> array = [1, 2, 3]
 => [1, 2, 3] 
> array.pop
 => 3 
> array
 => [1, 2] 

Arraypopメソッドが呼び出されないのはなぜpop!ですか?

4

3 に答える 3

11

それは完全には正しくありません。

Rubyスタイルガイドから

潜在的に「危険な」メソッド(つまり、selfまたは引数を変更するメソッド、exit!(exitのようにファイナライザーを実行しない)など)の名前は、その危険なバージョンの安全なバージョンが存在する場合、感嘆符で終わる必要があります。メソッド

また、popメソッドの名前は、それが何をしているのかを正確に示しているため、感嘆符で署名する必要はありません。

于 2012-06-19T20:10:12.420 に答える
2

「2番目の規則では、名前が感嘆符で終わるメソッドは注意して使用する必要があります。(...)多くの場合、感嘆符で終わるメソッドはミューテーターであり、オブジェクトの内部状態を変更します。ただし、これは常にそうであるとは限りません。感嘆符で終わらない多くのミューテーターと、感嘆符で終わる多くの非ミューテーターがあります。非ミューArray.fillテイタバリアントを持たないミューテイタメソッド(など)には、通常、感嘆符(原文のまま)がありません。 「」

(Rubyプログラミング言語、Flanagan&Matsumoto、180ページ)

この本は、例と(両方とも非変異、すべてのexitat_exitフックをスキップ)を続けています。exit!exit!

于 2012-06-19T20:37:40.740 に答える
1

この規則は引き続き有効ですが、スタックから何かを効果的に削除しているpop場合は、すべてのスタック実装でよく知られている方法です。pop

これはデータ構造の一般的な知識であり、ルビーの連中はそれに!記号を追加するのを見逃していました。

于 2012-06-19T20:00:46.507 に答える