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