Как изменить Список <String>на Список <dynamic>в Dart 2? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть List<String>, и мне нужно изменить его на List<dynamic> в Dart 2.

Сначала я попробовал этот код, но он не работает:

var str_list = ["aa", "bb"];

// fails - is not dynamic
// gives List<String> 
List<dynamic> target_list_0 = str_list;

Позже я попробовал эти 2 способа:

// succeeds - is dynamic
// gives List<dynamic> 
var target_list_1 = [] + str_list;

// succeeds - is dynamic
// gives List<dynamic> 
var target_list_2 = List<dynamic>.from(str_list);

Это работает, но я не уверен, что это лучший (или идиоматический) способ решения проблемы. Я хотел бы написать свой код Dart-2 как можно более чистым, не могли бы вы помочь?

Редактировать

@ matanlurey задал четкий пример, где нужен этот шаблон и как я его использую.

Я разрабатываю что-то вроде твиттера, но более сложное (не только #hashtags и @mentions, но и слова, имеющие внутреннюю структуру). Итак, я делаю некоторую модификацию исходного текста, затем разделяю его по пробелам (или скобкам) ​​на слова, а затем проверяю слово за словом. Если слово особенное, я заменяю строку на карту (содержащую анализируемую информацию). Изменение происходит на месте в списке. И вот где это мне нужно dynamic. У меня есть этот исходный код:

var split_regexp = new RegExp(r"[^\s\(\)]+|[\s\(\)]+");
var body_matches = split_regexp.allMatches(body_part);

var body = [] + body_matches.map(
    (m) => m.group(0)
).toList();

// ... processing it ...

В настоящее время я переписываю его из javascript (на который я переписал его из python). Оба языка способны поймать текст, по которому я разбиваю слова, это намного проще:

// python
body = re.split(r"([\s\(\)]+)", body)

// javascript
body = body.split(/([\s\(\)]+)/g)

Можно ли написать это так просто в дартс? Я думаю, что нет - потому что мне нужны пробельные символы разделителя (или круглые скобки или что-то в будущих версиях моего приложения), и dart split не улавливает его.

1 Ответ

0 голосов
/ 10 мая 2018

List.from(...) будет самым идиоматическим способом сегодня. Фактически, руководство по стилю теперь рекомендует , если вы пытаетесь изменить тип существующего списка:

// If you want to change the type, then calling List.from() is useful:

var numbers = [1, 2.3, 4]; // List<num>.
numbers.removeAt(1); // Now it only contains integers.
var ints = new List<int>.from(numbers);

как можно более чистым

Возможно, вы вообще не хотите List<dynamic>, в таком случае. Может помочь, если вы сможете привести четкие примеры, где этот шаблон необходим и как вы его используете.

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