我想使用 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 是否具有复制复杂对象的功能。
对于您在这里向我们展示的课程,没有什么比
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)
如果您clone
向Person
and添加一个方法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)
同样,我不建议使用这种方法。它适用于像这样的简单对象,但不适用于所有对象(并非所有对象都可以通过通信端口发送,例如,一流函数或任何包含一流函数的对象)。
编写您的类以支持您需要对它们进行的操作,包括复制。
我的更简单的解决方案只是让返回一个具有当前值的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()
。
对于字符串,您需要检查它们的行为,或者还创建/添加一种清理它们的方法。