【问题标题】:How to change List<String> to List<dynamic> in Dart 2?如何在 Dart 2 中将 List<String> 更改为 List<dynamic>?
【发布时间】:2018-05-09 11:41:13
【问题描述】:

我有一个List&lt;String&gt;,我需要在 Dart 2 中将其更改为 List&lt;dynamic&gt;

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

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 能写得这么简单吗?我不认为 - 因为我需要分隔符空格(或分隔符括号或我的应用程序的未来版本中的任何内容)并且 dart split 没有捕捉到它。

【问题讨论】:

  • 我认为var target_list_2 = List&lt;dynamic&gt;.from(str_list); 是最简洁的,因为它清楚地传达了该行的目的是列表类型转换。

标签: dart


【解决方案1】:

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&lt;dynamic&gt;。如果你能给出清楚的例子说明这个模式在哪里是必要的以及你是如何使用它的,这可能会有所帮助。

【讨论】:

  • 我已将请求的信息直接添加到我的问题中。
【解决方案2】:

不错的选择也是:

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

【讨论】:

  • 变量 numbers 不是 List 类型
猜你喜欢
  • 2021-03-25
  • 2021-03-27
  • 1970-01-01
  • 2021-03-29
  • 2021-05-20
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多