Dart ListBase不一致

时间:2013-12-14 00:02:16

标签: list function dart

Dart的ListBase类中函数的返回类型是否有任何特殊原因?

一些函数做了我期望的(作为函数式程序员),即:List - > (应用功能) - >名单。其中包括:takeskipreversed

其他人不这样做:因此l.removeLast()只返回列表的最后一个元素;要获得没有最终元素的List,您必须使用级联:l..removeLast()

其他人返回一个懒惰的Iterable,这需要进一步的工作来检索列表:newl = l.map(f).toList()

有些函数更像属性l.last,而不是函数l.removeLast()

这些选择有一些微妙的原因吗?

2 个答案:

答案 0 :(得分:2)

mbmcavoy是对的。 Dart是一种命令式语言,许多List成员就地修改了列表。最突出的是运营商[]=,但sortshuffleaddremoveLast等属于同一类别。

除了这些命令式成员之外,List还继承了Iterable中的一些功能风格的成员:skiptakewheremap等。这些是惰性的,不要修改List。它们由原始列表支持。修改后备列表将更改迭代迭代的结果。 List还添加了一些懒惰的成员,例如reversed

为避免混淆,延迟成员始终返回Iterable而不是实现List接口的对象。一些迭代可以保证快速length和索引运算符(如takeskipreversed)并且可以轻松实现List接口。然而,这将不可避免地导致错误,因为它们是懒惰的并且由原始列表支持。

答案 1 :(得分:1)

(免责声明:我还没有特别使用Dart,但希望很快。)

Dart不是一种函数式编程语言,可能是你混淆的源头。

.removeLast()等方法旨在更改调用它们的对象的状态。 l.removeLast()执行的操作是修改l,使其不再包含最后一项。您只需在下一个语句中使用l即可访问结果列表。

(注意它们被称为“方法”而不是“函数”,因为它们在数学意义上不是真正的函数。)

返回已删除项目而不是剩余列表的选择是一种方便。最常见的是,程序需要对删除的项目执行某些操作(例如将其移动到其他列表)。

对于其他方法,返回的数据将与常见的使用场景相关,但并不总是需要捕获它。