Dartには、JavaのようなClone
メソッドがありません。
なので、シャローコピーではなく、ディープコピーが欲しい場合、普通のオブジェクトでも色々と面倒なことをしないといけません。
ListやMapとなると更に大変です。
多分一番スマートな方法で、こうかな?
List<String> clone = []..addAll(originalList);
空で初期化して、addAll
する、というものです。
しかし、Dart2.3.0以降から、更に便利な構文が導入されていたので紹介します。
List<String> clone = [...originalList];
これだけ!
Mapでも出来ます。
Map<String, int> clone = {...originalMap};
テストコードを書いてみました。
void main() {
test('list deep copy', () {
var list = [1, 2, 3, 4, 5, 6, 7];
var list2 = [...list];
expect(listEquals(list, list2), isTrue); // これはpass
expect(list == list2, isTrue); // ここはfail
});
test('map deep copy', () {
var map = {1: 'a', 2: 'n', 3: 'v'};
var map2 = {...map};
expect(mapEquals(map, map2), isTrue); // これはpass
expect(map == map2, isTrue); // これはfail
});
}
ListやMapのoperator==
は、基本的にインスタンスが同じかの比較になりますので、ディープコピーしたオブジェクトとは一致しないわけですが、それぞれ、中身の比較を行うlistEquals
、mapEquals
は成功するというわけです。
...
は、spread operatorと言うそうです。
https://dart.dev/guides/language/language-tour#spread-operator
Dartって面白い言語ですね。
参考サイト