Dart的ListBase类中函数的返回类型是否有任何特殊原因?
一些函数做了我期望的(作为函数式程序员),即:List - > (应用功能) - >名单。其中包括:take
,skip
,reversed
。
其他人不这样做:因此l.removeLast()
只返回列表的最后一个元素;要获得没有最终元素的List,您必须使用级联:l..removeLast()
。
其他人返回一个懒惰的Iterable,这需要进一步的工作来检索列表:newl = l.map(f).toList()
。
有些函数更像属性l.last
,而不是函数l.removeLast()
这些选择有一些微妙的原因吗?
答案 0 :(得分:2)
List
成员就地修改了列表。最突出的是运营商[]=
,但sort
,shuffle
,add
,removeLast
等属于同一类别。
除了这些命令式成员之外,List还继承了Iterable
中的一些功能风格的成员:skip
,take
,where
,map
等。这些是惰性的,不要修改List。它们由原始列表支持。修改后备列表将更改迭代迭代的结果。 List
还添加了一些懒惰的成员,例如reversed
。
为避免混淆,延迟成员始终返回Iterable
而不是实现List
接口的对象。一些迭代可以保证快速length
和索引运算符(如take
,skip
和reversed
)并且可以轻松实现List
接口。然而,这将不可避免地导致错误,因为它们是懒惰的并且由原始列表支持。
答案 1 :(得分:1)
(免责声明:我还没有特别使用Dart,但希望很快。)
Dart不是一种函数式编程语言,可能是你混淆的源头。
.removeLast()
等方法旨在更改调用它们的对象的状态。 l.removeLast()
执行的操作是修改l,使其不再包含最后一项。您只需在下一个语句中使用l
即可访问结果列表。
(注意它们被称为“方法”而不是“函数”,因为它们在数学意义上不是真正的函数。)
返回已删除项目而不是剩余列表的选择是一种方便。最常见的是,程序需要对删除的项目执行某些操作(例如将其移动到其他列表)。
对于其他方法,返回的数据将与常见的使用场景相关,但并不总是需要捕获它。