Saltar al contenido

Clonar una lista, mapa o set en Dart

Solución:

Uso de clone() en Java es complicado y cuestionable1,2. Efectivamente, clone() es un constructor de copias y para eso, el Dart List, Map y Set cada tipo tiene un constructor con nombre llamado .from() que realizan una copia superficial; por ejemplo, dadas estas declaraciones

  Map<String, int> numMoons, moreMoons;
  numMoons = const <String,int>{ 'Mars' : 2, 'Jupiter' : 27 };
  List<String> planets, morePlanets;

puedes usar .from() como esto:

  moreMoons = new Map<String,int>.from(numMoons)
    ..addAll({'Saturn' : 53 });
  planets = new List<String>.from(numMoons.keys);
  morePlanets = new List<String>.from(planets)
    ..add('Pluto');

Tenga en cuenta que List.from() más generalmente acepta un iterador en lugar de solo un List.

En aras de la integridad, debo mencionar que el dart:html Node La clase define un método clone ().


1 J. Bloch, “Java eficaz“2ª Ed., Artículo 11.
2 B. Venners, “Josh Bloch sobre diseño: constructor de copias versus clonación“, 2002. Referenciado aquí3. Cita del artículo:

Si ha leído el artículo sobre la clonación en mi libro, especialmente si lee entre líneas, sabrá que creo que la clonación está profundamente rota. — J.Bloch

3 Dart Issue # 6459, instancia de clonación (objeto).

Para listas y conjuntos, normalmente uso

List<String> clone = []..addAll(originalList);

La advertencia, como menciona @kzhdev, es que addAll() y from()

[Do] realmente no hacer un clon. Añaden una referencia en el nuevo Mapa / Lista / Conjunto.

Por lo general, eso está bien para mí, pero lo tendré en cuenta.

Si está usando dart> 2.3.0, puede usar el operador de propagación algo como:

List<int> a = [1,2,3];
List<int> b = [...a]; // copy of a
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *