为什么Scala的Range是数据结构而不是函数?

时间:2016-05-17 23:11:33

标签: scala

我来自Python和R等语言的背景,两者都有range()函数,它们返回该语言的公共集合类型(Python的range()返回一个列表,而R {{1} }返回一个矢量)。

因此,我非常惊讶Scala提供range(),而不是作为函数,而是作为数据类型。更令人惊讶的是,Range不仅仅是RangeList等更常见的集合类型的别名,而且是它自己的独立数据类型!

有人可以解释一下Scala的设计理念中哪些部分导致Vector成为唯一数据类型的原因?

2 个答案:

答案 0 :(得分:2)

window.addEventListener('mousemove', function(e) { console.log(e.target); // ^^^^^^^^ your desired element is here. }); Range

之间的差异

ListRange是两个不同的概念,因此它们在Scala中实现为两个不同的类。 List是一系列值的特定实现。这些可以是任何顺序的任何值。另一方面,ListRange s的有序序列的实现,可以由三个Int来描述:Intstart和{{ 1}}(起始值,结束值和步长)。

end代表与step相同的内容,但不同。 List(1, 4, 7, 10, 13)超过Range(1, 14, 3)用作范围的主要优点是 Range的内存效率更高。用作范围的List会在该范围内保留内存中的所有整数,其中Range仅在内存中保留ListRangestart的值。

  

范围以恒定空间表示,因为它们可以定义   只有三个数字:他们的开始,结束和踩踏价值。   由于这种表示,范围上的大多数操作都是   非常快。 [source]

您可以通过调用endstep转换为Range(或List / toList将其转换为相应的收集类型。)

通过调用方法

创建toVector

在Scala中,创建toArray的首选方法是调用RangeRangeto方法(在until和{{1}中定义) })):

by

答案 1 :(得分:1)

为什么没有返回列表的函数

与Python 3的range(以及Python 2的xrange)类似,Scala的Range是一个可迭代的结构,只按需生成范围的元素,实际上并不存储它们记忆。这对于大范围的列表是优选的,因为在存储器中存储它们将消耗大量存储器,通常没有任何益处,因为大多数范围的使用不需要将元素存储在存储器中。这也是Python引入xrange然后用它替换旧range的原因。

那么为什么没有函数返回Seq或类似的

你可以问一个Range它的起始值是什么,结束它的步长是多少。如果它只是一个Seq,你就不能这样做。