gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:39:33 27 4
gpt4 key购买 nike

我想使用 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方法 PersonCity ,那么你显然可以使用它。
该语言没有内置任何内容来允许您复制对象的状态。

我建议至少通过添加构造函数来更改类:
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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com