我想使用 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();
}
这样做的方法(最佳实践)是什么?
更新说明:此 How can I clone an Object (deep copy) in Dart?前段时间发的。这里的重点是了解带来许多改进的 Dart 2 是否具有复制复杂对象的功能。
最佳答案
对于您在这里向我们展示的类(class),没有什么比
Person p2 = Person()
..name = p1.name
..surname = p1.surname
..city = (City()..name = p1.city.name..state = p1.city.state);
如果您添加
clone
方法 Person
和 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);
}
然后你可以通过写来克隆:
Person P2 = Person(p1.name, p1.surname, City(p1.city.name, p1.city.state));
(还有 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;
}
同样,我不建议使用这种方法。
它适用于像这样的简单对象,但不适用于所有对象(并非所有对象都可以通过通信端口发送,例如,一等函数或任何包含一等函数的对象)。
编写您的类以支持您需要对它们进行的操作,包括复制。
关于dart - 如何在 Dart 2 中克隆(复制值)复杂对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51352622/