Rubyには多くのメソッドがあり、特に配列または配列のようなオブジェクト、たとえばsort
or 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
flatten
a.flatten.object_id
とは異なる値を示すように、新しい配列オブジェクトを作成しますa.object_id
。
flatten!
として表示されるa
、参照するオブジェクトを変更します。a.flatten!.object_id
74502050