Rubyには多くのメソッドがあり、特に配列または配列のようなオブジェクト、たとえばsortor flatten. ただし、これらのメソッドには、 と のような双子 (感嘆符が付いているもの) もsort!ありflatten!ます。
今私の質問は次のとおりです。
flattenとflatten!(破壊的な平坦化)の違いは何ですか?- より一般的な質問ですが、なぜ破壊的と呼ばれるのですか?
違いは単純flattenに、配列のコピー (フラット化された新しい配列) を返し、flatten!「その場で」または「破壊的に」変更を行うことです。破壊的という用語は、元の配列を変更することを意味します。これは、最終結果をどうしたいかが分かっていて、元の構造が変更されても気にしない場合に便利です。
@paddeが指摘したように、構造が大きくなり、コピーに費用がかかるため、何かを破壊的に実行するために消費するメモリも少なくなります。
ただし、元の構造を維持したい場合は、メソッドを使用してコピーを作成することをお勧めします。
sortと を使用した例を次に示しsort!ます。
a = [9, 1, 6, 5, 3]
b = a.sort
c = [7, 6, 3]
c.sort!
コンテンツ:
a = [9, 1, 6, 5, 3]
b = [1, 3, 5, 6, 9]
c = [3, 6, 7]
Array#flatten:- 自分自身を (再帰的に) 1 次元で平坦化した新しい配列を返します。
Array#flatten!:- 自己をその場で平らにします。
a = [1,2,[3,4]]
p a.object_id #=> 74502050
p a.flatten.object_id #=> 74501960
p a.flatten!.object_id #=> 74502050
flattena.flatten.object_idとは異なる値を示すように、新しい配列オブジェクトを作成しますa.object_id。
flatten!として表示されるa、参照するオブジェクトを変更します。a.flatten!.object_id74502050