в дротике, который лучше List.generate или List.of или List.from - PullRequest
0 голосов
/ 01 мая 2020

в Dart Documentation у нас есть три итерируемых варианта для создания списков. Какой из них лучше всего подходит для каких целей и какой более эффективен для каких целей?

Ответы [ 2 ]

1 голос
/ 01 мая 2020

По сути, вы никогда не должны использовать ни один из этих конструкторов.

Каждый из них имеет свое применение, но большинство из этих применений теперь могут быть написаны с использованием литералов списка.

List.generate является подвеска к List.filled. Последний создает список, заполненный одинаковым значением в каждом слоте, первый позволяет вычислять новое значение для каждого слота. С помощью collection-for я, вероятно, написал бы:

 var newList = [for (var i = 0; i < 10; i++) compute(i)];

вместо

 var newList = List.generate(10, compute);

(даже более того, если я смогу встроить функцию compute). Единственный случай, когда generate имеет смысл, - это создать список фиксированной длины. Литерал не может этого сделать.

Я бы также сказал, что вы не должны никогда использовать List.of(something). Вместо этого используйте something.toList() или [...something]. Если вам нужно повысить, скажем, создать List<num> из Iterable<int>, вы можете сделать <num>[...something], но вы не можете использовать toList. Если вам нужно сделать фиксированной длины List<num>, ... тогда я думаю, что List<num>.of(something, growable: false) на самом деле самое простое решение.

Единственная причина использования List.from заключается в том, что исходный итерируемый тип не имеет требуемого типа. Если вы знаете, что ваш Iterable<num> содержит только целые числа, вы можете сделать List<int>.from(iterable). Вы также можете сделать iterable.cast<int>().toList() или [for (var v in iterable) v as int], но List.from может быть короче. Всегда предоставляют переменную типа для List.from.

Итак, в общем: Используйте только один из этих конструкторов, если вам нужен список фиксированной длины (с передачей growable: false), или если вы хотите преобразовать элементы с помощью List.from, а затем всегда предоставлять аргумент типа.

В противном случае используйте литералы списка. Вероятно, это тоже будет более эффективным, поскольку позволяет избежать вызовов некоторых функций.

1 голос
/ 01 мая 2020

List.generate - Это полезно, если источник вашего списка не относится к типу List или вам нужен специальный лог c при получении элементов списка;

List.of - проверка типа выполняется во время компиляции.

List.from - проверка типов выполняется только во время выполнения.

Оба List.of и List.from работают одинаково. Но вы должны предпочесть List.of над List.from, чтобы проверка типа выполнялась уже во время компиляции.

Если вы хотите посмотреть более внимательно, взгляните на этот пример: https://dartpad.dev/b9cd4acdeec266cb366155c6ec40b4f1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...