flattenとflatten!
Rubyでは、多くの破壊的メソッドに!が付いています。ただし、すべての破壊的メソッドに!がついているわけではありません。
flattenとflatten!では、!のついた方が破壊的メソッドです。a.flattenの戻り値はフラットにした新しい配列ですが、a.flatten!の戻り値はaです。aそのものがフラットになったのです。
a = ["A", ["B", "C"], ["D", "E"]] p a b = a.flatten p b if a == b print "flatten: same\n" else print "flatten: not same\n" end b = a.flatten! p a if a == b print "flatten!: same\n" else print "flatten!: not same\n" end
実行結果です。
["A", ["B", "C"], ["D", "E"]] ["A", "B", "C", "D", "E"] flatten: not same ["A", "B", "C", "D", "E"] flatten!: same