我来自Python和R等语言的背景,两者都有range()
函数,它们返回该语言的公共集合类型(Python的range()
返回一个列表,而R {{1} }返回一个矢量)。
因此,我非常惊讶Scala提供range()
,而不是作为函数,而是作为数据类型。更令人惊讶的是,Range
不仅仅是Range
或List
等更常见的集合类型的别名,而且是它自己的独立数据类型!
有人可以解释一下Scala的设计理念中哪些部分导致Vector
成为唯一数据类型的原因?
答案 0 :(得分:2)
window.addEventListener('mousemove', function(e) {
console.log(e.target);
// ^^^^^^^^ your desired element is here.
});
和Range
List
和Range
是两个不同的概念,因此它们在Scala中实现为两个不同的类。 List
是一系列值的特定实现。这些可以是任何顺序的任何值。另一方面,List
是Range
s的有序序列的实现,可以由三个Int
来描述:Int
,start
和{{ 1}}(起始值,结束值和步长)。
end
代表与step
相同的内容,但不同。 List(1, 4, 7, 10, 13)
超过Range(1, 14, 3)
用作范围的主要优点是
Range
的内存效率更高。用作范围的List
会在该范围内保留内存中的所有整数,其中Range
仅在内存中保留List
,Range
和start
的值。
范围以恒定空间表示,因为它们可以定义 只有三个数字:他们的开始,结束和踩踏价值。 由于这种表示,范围上的大多数操作都是 非常快。 [source]
您可以通过调用end
将step
转换为Range
(或List
/ toList
将其转换为相应的收集类型。)
toVector
在Scala中,创建toArray
的首选方法是调用Range
,Range
和to
方法(在until
和{{1}中定义) })):
by
答案 1 :(得分:1)
与Python 3的range
(以及Python 2的xrange
)类似,Scala的Range
是一个可迭代的结构,只按需生成范围的元素,实际上并不存储它们记忆。这对于大范围的列表是优选的,因为在存储器中存储它们将消耗大量存储器,通常没有任何益处,因为大多数范围的使用不需要将元素存储在存储器中。这也是Python引入xrange
然后用它替换旧range
的原因。
Seq
或类似的你可以问一个Range
它的起始值是什么,结束它的步长是多少。如果它只是一个Seq
,你就不能这样做。