dart 新手问题.

List是Iterable的子类,一些List方法返回Iterable而不是List,例如List的where method.如果我们将一个变量声明为List,我们必须在很多地方调用toList.

总是将变量声明为Iterable类型而不是List(或任何其他子类型),这样我们的代码是通用的且易于更改,这样更好吗?这样做有什么坏处吗?这更像是一个最佳实践问题.

编辑内容

在我的代码库中将一些列表更改为Iterable后,我发现Iterable实例没有add个方法.顾名思义,它以前只是iterated.太明显了.

推荐答案

您应该将变量声明为提供所需功能和保证的最精确类型.

List保证了有效的长度和随机访问操作,并提供了对sortshuffle等功能的访问,这些功能只有在从一开始就可以访问所有元素时才有效.它们属于List,因为如果它们属于Iterable,那么每个有效的实现都会从toList开始,以获得一个列表.

您应该以同样的方式思考您的代码:如果您想要或期望一个列表,则将其键入为List.如果您可以处理任何集合,可以使用Iterable-这通常意味着您使用的操作都可以由元素上的for-in实现. 如果您总是要在使用迭代之前将其转换为列表,那么您不妨键入List作为变量,以确保您记得创建列表.

或者,简而言之,如果你不在乎它是SetQueue还是LinkedList,或者它是不可修改的还是懒惰的,你可以把它设为Iterable.

(通常情况下,您仍然应该只迭代一次可迭代的对象-当您想要使用它两次时,它是likely,您最好从它创建一个有保证的非惰性集合-而List是创建成本最低的集合).

Dart相关问答推荐

为什么我们在dart 里有工具?

dart 中的 Function() 和 Function 有什么区别?

ListView 不会刷新,而附加列表会刷新 (Flutter)

Dart:使用正则表达式从字符串中删除空格

Flutter Expansion Tile -- 标题 colored颜色 变化和尾随动画箭头 colored颜色 变化

dart 中 call() 的实现是什么?

不要将 PageView 居中 - Flutter

如何在DartPad中导入库?

使用 Google Dart 进行数据库查询?

判断无状态小部件是否在Flatter中处理

从real mobile浏览器访问Flatter localhost

Flutter-键盘显示和隐藏导致生成调用

如何在dart中获取 map 的键列表?

如何将任意数据从 Dart polymer Web 组件传递到单击事件处理函数

Dart 中使用的const关键字是什么?

Dart 转换列表的每个元素

学习 Dart 好还是我必须使用基本的 javascript?

判断 datetime 变量是今天、明天还是昨天

你如何在 Dart 中打印美元符号 $

将多张map合并/合并为一张map