Исходя из фона Java: какой рекомендуемый способ «клонировать» Dart List
, Map
и Set
?Clone a List, Map или Set in Dart
ответ
Использование clone()
в Java является сложным и сомнительным 1,2. Эффективно clone()
является копирующим конструктором, и для этого типы Dart List
, Map
и Set
имеют named constructor с именем .from()
, которые выполняют shallow copy; например учитывая эти заявления
Map<String, int> numMoons, moreMoons;
numMoons = const <String,int>{ 'Mars' : 2, 'Jupiter' : 27 };
List<String> planets, morePlanets;
вы можете использовать .from()
так:
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');
Обратите внимание, что List.from()
более обычно принимает итератор, а не только List
.
Для полноты я должен упомянуть, что класс dart:html
Node
определяет метод clone().
И. Блох, "Effective Java" 2-е изд., Пункт 11.
B. Venners, "Josh Bloch on Design: Copy Constructor versus Cloning", 2002. Ссылка отсюда . Цитата из статьи:
Если вы читали пункт о клонировании в моей книге, особенно если вы читаете между строками, вы будете знать, что я думаю, что клон глубоко сломан. --- J.Bloch
- 1. Nullable list in a model
- 2. Clone a DataBound Checked List Box
- 3. python slice set in list
- 4. Preinititalize a map in C++
- 5. set map implementation in C++
- 6. Set Escape in a View
- 7. set array list list list
- 8. Counting Occurrences In A Map
- 9. clone a div in display none mode
- 10. «set! Not a identifier» in Scheme
- 11. Iterate List <Map> in Ibatis
- 12. set a Image-map for the text
- 13. Dart - set mimetype HttpClientRequest
- 14. Есть ли общий способ создания un-modifiable List/Set/Map из Collection/List/Set ...?
- 15. set input value clone
- 16. Сохранить std :: set in std :: list
- 17. Dart Convert List as Map Entry для кодирования JSON
- 18. Set pageCount in a cakephp pagination
- 19. map <A, set<A*>> vs. set <A> где A содержит набор A *
- 20. Clone/Copy unmodifable list
- 21. set language in a django view
- 22. Set ActiveRecord Scopes In A Loop
- 23. Dynamic Instantiate in Dart
- 24. Pretty-print a Map in Java
- 25. add function in List/Set показывает логическое значение
- 26. List (или итератор) кортежей, возвращаемых MAP (PySpark)
- 27. Dart runtimeType check in switch statement
- 28. a databind dropdow- list
- 29. Urlencode deep in dart
- 30. Objectify Set vs List
Джош Блох фактически был вовлечен в некоторые из ранних проектов API коллекций Дартов. [Старое интервью] (https://www.youtube.com/watch?v=wmsVHdllIPM). –
. Из-под() и .addAll() на самом деле не делается клонирование. Они добавляют ссылку в новый Map/List/Set. Например: Map map1 = { 'one': {'name': 1}, 'two': {'name': 2}, 'three': [{ 'a': { 'A' : 1, 'В': 2 }, 'B': { 'а': 3, 'В': 4} }] }; Map map2 = new Map.from (map1); map2 ['two'] ['name'] = 4; После изменения map2 ['two'] ['name'], map1 также изменен – kzhdev
Вправо. '.from()' является конструктором _shallow_ copy. Чтобы быть ясным, я никогда не говорил, что '.from()' выполнил операцию клонирования. Я писал, что 'clone()' был своего рода конструктором копий. –