问题 如何在Dart中克隆对象(深层复制)?


是否有语言支持的方式在Dart中制作完整(深)的对象副本?

仅限中学;有多种方法可以做到这一点,有什么区别?

谢谢你的澄清!


7622
2017-10-28 10:03


起源



答案:


没有公开的问题似乎表明:

http://code.google.com/p/dart/issues/detail?id=3367

特别是:

.. Objects have identity, and you can only pass around references to them. There is no implicit copying.

9
2017-10-28 10:19



谢谢,我刚刚结束了为我需要制作副本的几个类(不仅仅是一个引用)编写克隆方法。我被Ruby宠坏了 - 认为这是一个标准的语言功能。 - george koller
它被假定为标准语言特征= _ =“ - srcspider
这太傻了。你不需要这个吗? - pjv
即使在官方dart聚合物教程中,他们也可以手动实现copyCodelab()函数。确实有这样的stdlib功能。我会为此提交一个错误。 - Michał Šrajer


答案:


没有公开的问题似乎表明:

http://code.google.com/p/dart/issues/detail?id=3367

特别是:

.. Objects have identity, and you can only pass around references to them. There is no implicit copying.

9
2017-10-28 10:19



谢谢,我刚刚结束了为我需要制作副本的几个类(不仅仅是一个引用)编写克隆方法。我被Ruby宠坏了 - 认为这是一个标准的语言功能。 - george koller
它被假定为标准语言特征= _ =“ - srcspider
这太傻了。你不需要这个吗? - pjv
即使在官方dart聚合物教程中,他们也可以手动实现copyCodelab()函数。确实有这样的stdlib功能。我会为此提交一个错误。 - Michał Šrajer


Darts内置集合使用名为“from”的命名构造函数来完成此任务。看这篇文章: 在Dart中克隆列表,地图或设置

Map mapA = {
    'foo': 'bar'
};
Map mapB = new Map.from(mapA);

4
2018-02-17 03:26



这可能适用于简单的<String,String> Map,但它不适用于更复杂的地图,如<String,Map>。我有和你一样的想法,但它没有用。 - Azael
from 是一个构造函数。使用 new Map.from(mapA); - Moshe Shaham


我想对于不太复杂的对象,你可以使用转换库:

import 'dart:convert';

然后使用JSON编码/解码功能

Map clonedObject = JSON.decode(JSON.encode(object));

如果您使用自定义类作为要克隆的对象中的值,则该类要么需要实现toJson()方法,要么必须为JSON.encode方法提供toEncodable函数,并为解码调用提供reviver方法。


3
2017-10-28 18:41