Existe-t-il un moyen, supporté par le langage, de faire une copie complète (profonde) d'un objet dans Dart ?
Secondaire uniquement ; existe-t-il plusieurs façons de procéder, et quelles sont les différences ?
Merci pour la clarification !
Existe-t-il un moyen, supporté par le langage, de faire une copie complète (profonde) d'un objet dans Dart ?
Secondaire uniquement ; existe-t-il plusieurs façons de procéder, et quelles sont les différences ?
Merci pour la clarification !
Les collections intégrées de Darts utilisent un constructeur nommé appelé "from" pour accomplir ceci. Voir cet article : Cloner une liste, une carte ou un ensemble dans Dart
Map mapA = {
'foo': 'bar'
};
Map mapB = new Map.from(mapA);
J'interviens tardivement, mais j'ai récemment été confronté à ce problème et j'ai dû faire quelque chose du type :-.
class RandomObject {
RandomObject(this.x, this.y);
RandomObject.clone(RandomObject randomObject): this(randomObject.x, randomObject.y);
int x;
int y;
}
Ensuite, vous pouvez simplement appeler la copie avec l'original, comme ceci :
final RandomObject original = RandomObject(1, 2);
final RandomObject copy = RandomObject.clone(original);
Non, pour autant que les questions ouvertes semblent le suggérer :
https://github.com/dart-lang/sdk/issues/3367
Et plus précisément :
... Les objets ont une identité, et vous pouvez seulement transmettre des références à eux. Il n'y a pas de copie implicite.
Je suppose que pour les objets pas trop complexes, vous pouvez utiliser la bibliothèque convert :
import 'dart:convert';
et ensuite utiliser la fonctionnalité d'encodage/décodage JSON
Map clonedObject = JSON.decode(JSON.encode(object));
Si vous utilisez une classe personnalisée comme valeur dans l'objet à cloner, la classe doit soit implémenter une méthode toJson(), soit fournir une fonction toEncodable pour la méthode JSON.encode et une méthode reviver pour l'appel decode.
Malheureusement, il n'y a pas de support linguistique. Ce que j'ai fait, c'est créer une classe abstraite appelée Copyable
que je peux implémenter dans les classes que je veux pouvoir copier :
abstract class Copyable<T> {
T copy();
T copyWith();
}
Je peux ensuite l'utiliser comme suit, par exemple pour un objet Location :
class Location implements Copyable<Location> {
Location({
required this.longitude,
required this.latitude,
required this.timestamp,
});
final double longitude;
final double latitude;
final DateTime timestamp;
@override
Location copy() => Location(
longitude: longitude,
latitude: latitude,
timestamp: timestamp,
);
@override
Location copyWith({
double? longitude,
double? latitude,
DateTime? timestamp,
}) =>
Location(
longitude: longitude ?? this.longitude,
latitude: latitude ?? this.latitude,
timestamp: timestamp ?? this.timestamp,
);
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.