Есть ли способ, поддерживаемый языком, сделать полную (глубокую) копию объекта в Dart?
Только вторичный; есть ли несколько способов сделать это, и каковы различия?
Спасибо за разъяснение!
Есть ли способ, поддерживаемый языком, сделать полную (глубокую) копию объекта в Dart?
Только вторичный; есть ли несколько способов сделать это, и каковы различия?
Спасибо за разъяснение!
Нет, насколько открытые проблемы, похоже, подсказывают:
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.
В встроенных коллекциях дартс используется именованный конструктор, называемый "из", чтобы выполнить это. См. Это сообщение: Клонировать список, карту или установить в дротике
Map mapA = {
'foo': 'bar'
};
Map mapB = new Map.from(mapA);
Я думаю, что для не слишком сложных объектов вы можете использовать библиотеку convert:
import 'dart:convert';
а затем использовать функцию кодирования/декодирования JSON
Map clonedObject = JSON.decode(JSON.encode(object));
Если вы используете пользовательский класс как значение в клонированном объекте, классу либо нужно реализовать метод toJson(), либо вы должны предоставить функцию toEncodable для метода JSON.encode и метод reviver для вызов декодирования.
Допустим, у вас есть класс
Class DailyInfo
{
String xxx;
}
Создайте новый клон объекта класса dailyInfo от
DailyInfo newDailyInfo = new DailyInfo.fromJson(dailyInfo.toJson());
Чтобы это работало, ваш класс должен быть реализован
factory DailyInfo.fromJson(Map<String, dynamic> json) => _$DailyInfoFromJson(json);
Map<String, dynamic> toJson() => _$DailyInfoToJson(this);
что можно сделать, сделав класс сериализуемым, используя
@JsonSerializable(fieldRename: FieldRename.snake, includeIfNull: false)
Class DailyInfo{
String xxx;
}
Опоздал на вечеринку, но недавно я столкнулся с этой проблемой, и мне пришлось что-то делать: -
class RandomObject {
RandomObject(this.x, this.y);
RandomObject.clone(RandomObject randomObject): this(randomObject.x, randomObject.y);
int x;
int y;
}
Затем вы можете просто вызвать копию с оригиналом, например: -
final RandomObject original = RandomObject(1, 2);
final RandomObject copy = RandomObject.clone(original);