如何在Dart 2中克隆(复制值)复杂对象 [英] How to clone (copy values) a complex object in Dart 2

查看:1399
本文介绍了如何在Dart 2中克隆(复制值)复杂对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I would like to clone a complex object (copy values), not referencing, using 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();
}

这样做的最佳方式是什么?

What would be the way (best practice) to do this?

更新说明::此一段时间前发布了如何在Dart中克隆对象(深拷贝)?这里的重点是了解进行了许多改进的Dart 2是否具有复制复杂对象的功能。

Update note: This How can I clone an Object (deep copy) in Dart? was posted some time ago. The focus here is to understand if Dart 2 that is bringing many improvements, has a facility for copying complex objects.

推荐答案

您在这里向我们展示的课程,没有什么比

With the classes you have shown us here, there is nothing shorter than

Person p2 = Person()
  ..name = p1.name
  ..surname = p1.surname
  ..city = (City()..name = p1.city.name..state = p1.city.state);

如果您将 clone 方法添加到城市,那么您显然可以使用它。
该语言没有内置功能可让您复制对象的状态。

If you add a clone method to Person and City, then you can obviously use that. There is nothing built in to the language to allow you to copy the state of an object.

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

I would recommend changing the classes, at least by adding a constructor:

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);
}

然后您可以通过以下方式克隆:

Then you can clone by just writing:

Person P2 = Person(p1.name, p1.surname, City(p1.city.name, p1.city.state));

(还有关于名称的ob-link

我说有没有语言功能可以复制对象,但是实际上,如果您可以访问 dart:isolate 库,则可以:通过隔离通信端口发送对象。我不建议您使用该功能,但这是出于完整性考虑:

I say that there is no language feature to copy objects, but there actually is, if you have access to the dart:isolate library: Sending the object over a isolate communication port. I cannot recommend using that feature, but it's here for completeness:

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;
}

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

Again, I cannot recommend using this approach. It would work for simple objects like this, but it doesn't work for all objects (not all objects can be sent over a communication port, e.g., first-class functions or any object containing a first class function).

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

Write your classes to support the operations you need on them, that includes copying.

这篇关于如何在Dart 2中克隆(复制值)复杂对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆