如何在 Dart 2 中克隆(复制值)复杂对象

Muk*_*uka 15 dart

我想使用 Dart 2 克隆一个复杂的对象(复制值),而不是引用。

例子:

class Person {
  String name;
  String surname;
  City city;
}

class City {
  String name;
  String state;
}

main List<String> args {
  City c1 = new City()..name = 'Blum'..state = 'SC';
  Person p1 = new Person()..name = 'John'..surname = 'Xuebl'..city = c1;


  Person p2 = // HERE, to clone/copy values... Something similar to p1.clone();
}
Run Code Online (Sandbox Code Playgroud)

这样做的方法(最佳实践)是什么?

更新说明:如何在 Dart 中克​​隆一个对象(深拷贝)?前段时间发的。这里的重点是了解带来许多改进的 Dart 2 是否具有复制复杂对象的功能。

lrn*_*lrn 8

对于您在这里向我们展示的课程,没有什么比

Person p2 = Person()
  ..name = p1.name
  ..surname = p1.surname
  ..city = (City()..name = p1.city.name..state = p1.city.state);
Run Code Online (Sandbox Code Playgroud)

如果您clonePersonand添加一个方法City,那么您显然可以使用它。该语言没有内置任何内容来允许您复制对象的状态。

我建议至少通过添加构造函数来更改类:

class Person {
  String name;
  String surname;
  City city;
  Person(this.name, this.surname, this.city);
}
class City {
  String name;
  String state;
  City(this.name, this.state);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以通过写来克隆:

Person P2 = Person(p1.name, p1.surname, City(p1.city.name, p1.city.state));
Run Code Online (Sandbox Code Playgroud)

(以及关于名称的ob-link

我说没有复制对象的语言功能,但实际上,如果您有权访问该dart:isolate库:通过隔离通信端口发送对象。我不建议使用该功能,但为了完整起见,它在这里:

import "dart:isolate";
Future<T> clone<T>(T object) {
  var c = Completer<T>();
  var port = RawReceivePort();
  port.handler = (Object o) {
    port.close();
    c.complete(o);
  }
  return c.future;
}
Run Code Online (Sandbox Code Playgroud)

同样,我不建议使用这种方法。它适用于像这样的简单对象,但不适用于所有对象(并非所有对象都可以通过通信端口发送,例如,一流函数或任何包含一流函数的对象)。

编写您的类以支持您需要对它们进行的操作,包括复制。


a.l*_*l.e 6

我的更简单的解决方案只是让返回一个具有当前值的clone()新值:Person

class Person {
  String name;
  String surname;
  City city;
  Person(this.name, this.surname, this.city);
  clone() => Person(name, surname, city);
}
Run Code Online (Sandbox Code Playgroud)

您可能还需要递归地克隆Person. 作为示例,clone()在 中创建一个类似的函数City并将其用作此处city.clone()
对于字符串,您需要检查它们的行为,或者还创建/添加一种清理它们的方法。