38
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DartのListやMapのClone(Deep Copy)

Last updated at Posted at 2020-04-13

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==は、基本的にインスタンスが同じかの比較になりますので、ディープコピーしたオブジェクトとは一致しないわけですが、それぞれ、中身の比較を行うlistEqualsmapEqualsは成功するというわけです。

...は、spread operatorと言うそうです。
https://dart.dev/guides/language/language-tour#spread-operator

Dartって面白い言語ですね。

参考サイト

38
17
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?