我想克隆一个复杂的对象(复制值),而不是引用,使用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();
}
这样做的方法(最佳做法)是什么?
更新注意:这个如何在Dart中复制对象(深拷贝)?是不久前发布的。这里的重点是了解Dart 2(它带来了许多改进)是否具有复制复杂对象的功能。
发布于 2018-07-16 07:41:11
有了你在这里教我们的课程,没有比这更短的了。
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-链接 )
我说,没有语言特性可以复制对象,但如果您能够访问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;
}
同样,我不能建议使用这种方法。它适用于像这样的简单对象,但并不适用于所有对象(并非所有对象都可以通过通信端口发送,例如,一类函数或任何包含头类函数的对象)。
编写类以支持所需的操作,包括复制。
发布于 2020-12-17 13:43:51
我的更简单的解决方案只是让clone()
返回一个具有当前值的新Person
:
class Person {
String name;
String surname;
City city;
Person(this.name, this.surname, this.city);
clone() => Person(name, surname, city);
}
您可能还需要递归地克隆Person
中的对象。例如,在clone()
中创建一个类似的City
函数,并在这里使用它作为city.clone()
。
对于字符串,您需要检查它们的行为,或者创建/添加清理它们的方法。
发布于 2018-07-17 15:50:58
如前所述,没有内置的解决方案,但是如果ideia要实现不变的值类型,您可以检查价值。
https://medium.com/dartlang/darts-built-value-for-immutable-object-models-83e2497922d4
https://stackoverflow.com/questions/51352622
复制相似问题