Как преобразовать Iterable типа X в тип Y Re: Iterable <WordPair>в Iterable <String> - PullRequest
0 голосов
/ 29 апреля 2018

В pubspec.yaml я использую библиотеку english_words для генерации пар слов:

dependencies:
 flutter:
   sdk: flutter

 # Contains a few thousand of the most used English words
 # plus some utility functions.
 english_words: ^3.1.0

Теперь класс WordPair не является подтипом String, и поэтому я не могу использовать лямбда-выражения или функции Iterable, такие как cast или retype, для «приведения» WordPairs к строкам.

Итак, мне пришлось написать функцию getWords ().

См. Ниже файл Dart, Model.dart, который содержит эту реализацию.

Вы увидите закомментированную старую строку, в которой она возвращала в метод получения тип Iterable.

Был бы более эффективный способ сделать это?

Например, я не хотел привлекать List List к преобразованию, но я не могу найти другого способа успешно это сделать.

Спасибо.

---------------- Model.dart

 import 'package:english_words/english_words.dart' show WordPair, generateWordPairs;

 import 'dart:collection';

 /// Model Class
 ///
 class Model {

 String get randomWordPair => new WordPair.random().asPascalCase;

   //  Iterable<WordPair> get wordPairs =>  generateWordPairs().take(10);

 Iterable<String> get wordPairs => getWords();


  Iterable<String> getWords(){

     Iterable<WordPair> pairs = generateWordPairs().take(10);

     ListWords<String> words = new ListWords();

     for (var pair in pairs) {

       words.add(pair.asString);
     }

     return words;
   }
}


class ListWords<E> extends ListBase<E> {

  final List<E> l = [];

  set length(int newLength) { l.length = newLength; }

  int get length => l.length;

  E operator [](int index) => l[index];

  void operator []=(int index, E value) { l[index] = value; }
}

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

В Dart 2 вы можете использовать

iterable.cast<NewType>()

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

Обычно более эффективны

new List<NewType>.of(oldList)

или

new List.from<NewType.from(oldList)

Мне не удалось вывести разницу между .of() и from() из документов, хотя (https://api.dartlang.org/dev/2.0.0-dev.50.0/dart-core/List/List.from.html, https://api.dartlang.org/dev/2.0.0-dev.50.0/dart-core/List/List.of.html)

0 голосов
/ 30 апреля 2018

На первый взгляд, цикл, который собирает результат выражения, обычно можно заменить соответствующим вызовом метода .map в Iterable. Посмотрим, поможет ли это.

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