如何在Dart 2中将List <string>更改为List <dynamic>?

时间:2018-05-09 11:41:14

标签: dart

我有一个List<String>,我需要在Dart 2中将其更改为List<dynamic>

首先,我尝试了这段代码,但它不起作用:

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

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

后来,我试过这两种方式:

// 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问清楚这个模式是必要的以及我如何使用它的例子。

我正在开发类似twitter但更复杂的东西(不仅是#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无法捕获它。

2 个答案:

答案 0 :(得分:16)

今天,

List.from(...)将成为最惯用的方式。实际上,the style guide now recommends it如果您尝试更改现有列表的类型:

// 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> 。如果你能给出明确的例子,说明这种模式是必要的,以及你如何使用它,这可能会有所帮助。

答案 1 :(得分:-1)

好的选择还有:

var numbers = [1, 4]; // List<dynamic>
var ints = numbers.map((s) => s as int).toList();