首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Dart 2中复制(复制值)复杂对象

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

Stack Overflow用户
提问于 2018-07-15 22:17:17
回答 5查看 15.1K关注 0票数 17

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

示例:

代码语言:javascript
运行
复制
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(它带来了许多改进)是否具有复制复杂对象的功能。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-07-16 07:41:11

有了你在这里教我们的课程,没有比这更短的了。

代码语言:javascript
运行
复制
Person p2 = Person()
  ..name = p1.name
  ..surname = p1.surname
  ..city = (City()..name = p1.city.name..state = p1.city.state);

如果将clone方法添加到PersonCity中,那么显然可以使用该方法。语言中没有内置的内容允许您复制对象的状态。

我建议更改类,至少添加一个构造函数:

代码语言:javascript
运行
复制
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);
}

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

代码语言:javascript
运行
复制
Person P2 = Person(p1.name, p1.surname, City(p1.city.name, p1.city.state));

(关于名字的ob-链接 )

我说,没有语言特性可以复制对象,但如果您能够访问dart:isolate库,则实际上是这样的:通过隔离通信端口发送对象。我不建议使用该特性,但它是为了完整性而出现的:

代码语言:javascript
运行
复制
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;
}

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

编写类以支持所需的操作,包括复制。

票数 10
EN

Stack Overflow用户

发布于 2020-12-17 13:43:51

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

代码语言:javascript
运行
复制
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()

对于字符串,您需要检查它们的行为,或者创建/添加清理它们的方法。

票数 6
EN

Stack Overflow用户

发布于 2018-07-17 15:50:58

如前所述,没有内置的解决方案,但是如果ideia要实现不变的值类型,您可以检查价值

https://medium.com/dartlang/darts-built-value-for-immutable-object-models-83e2497922d4

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51352622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档