Как на самом деле работает отображение списков в дартс? - PullRequest
0 голосов
/ 01 февраля 2020

Я пришел из javascript фона, и в javascript, если у меня был массив с элементами [1,2,3], я могу отобразить этот массив и выполнить функцию на каждой итерации следующим образом:

[1,2,3].map((i) => {
    console.log(i);
    return;
})

и я получаю

1
2
3

Пробую то же самое в дротике

void main() {
  [1, 2, 3].map((i) {
    print(i);
    return;
  });
}

Нет вывода на печать, что мне не хватает?

1 Ответ

2 голосов
/ 01 февраля 2020

JavaScript отличается от Dart.

Согласно документации , метод map для Iterable означает

вернуть новый lazy Iterable с элементами, созданными путем вызова f для каждого элемента этого элемента Iterable в итерационном порядке.

Другими словами, функция в map метод не вызывается, пока он не понадобится, потому что он lazi вызван. Он ничего не вернет, пока что-то не спросит, что он должен вернуть. Пока возвращаемое Iterable не повторяется, предоставленная функция f не будет вызываться.

Попробуйте dartpad.dev

void main() {
  var arr = [1, 2, 3];
  var arr2 = arr.map((item)=> {
     item * 2
  });
  print ('$arr2');
}

В приведенном выше примере функция в методе map, соответствующем arr, вызывается / вызывается, потому что ее запрашивает $arr2 в функции печати. Из-за этого он запускает код внутри него, и параметр в методе print выводится на печать

Try

  print([1, 2, 3].map((i) {
    print(i);
    return;
  }));

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

Поскольку метод lazy , он не будет вызван, пока его не запросят. Добавление метода map в массив не вызывает его. Вы должны требовать, что он возвращает для вызова функции в методе map.

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