4

Rubyには多くのメソッドがあり、特に配列または配列のようなオブジェクト、たとえばsortor flatten. ただし、これらのメソッドには、 と のような双子 (感嘆符が付いているもの) もsort!ありflatten!ます。

今私の質問は次のとおりです。

  • flattenflatten!(破壊的な平坦化)の違いは何ですか?
  • より一般的な質問ですが、なぜ破壊的と呼ばれるのですか?
4

2 に答える 2

9

違いは単純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]
于 2013-05-22T03:16:45.350 に答える
1

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

于 2013-05-22T04:45:10.333 に答える