Scala数组构造函数?
scala> val a = Array [Double] (10)
a: Array[Double] = Array(10.0)
scala> val a = new Array [Double] (10)
a: Array[Double] = Array(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
为什么这两个表达式有不同的语义?Scala数组构造函数?
这是一个有点混乱,但Scala有类它可以创建的实例,对象,这基本上是一个类的实例单的概念。它还具有伴随类的概念,它是一对类和具有相同名称的对象。这种机制允许一个“类”实质上具有静态方法,否则在Scala中是不可能的。
Array
既有类和同伴对象。此外,Array
object有一个apply
方法。 apply
表示您可以使用Array(arg)
创建一个对象。但由于Array
是一个伴侣类,它也有一个构造函数,可以通过更常用的机制new Array(arg)
来调用。
问题是Array
对象中的apply
与Array
构造函数具有不同的语义。 apply
方法创建指定对象外的数组,因此,例如,Array(1,2,3)
返回由对象1
,2
和3
组成的数组。另一方面,构造函数接受指定数组维数大小的参数(以便您可以创建多维数组),然后将所有插槽初始化为默认值。
所以,基本上:
-
val a = Array [Double] (10)
调用Array
对象,它创建包含给定对象的新阵列上的apply
方法。 -
val a = new Array [Double] (10)
调用Array
构造函数,该构造函数创建一个具有10个插槽的新阵列,全部初始化为缺省值0.0
。
很棒的回答。谢谢! – 2010-04-23 16:47:55
@mipadi,如何创建一个10个插槽和1作为默认值的新阵列?谢谢 – city 2013-10-02 01:40:05
@city'val a = Array.fill(10){1}' – 2016-11-11 19:25:56
new Array[Double](10)
应该相当于Java中的new double[10]
。
但斯卡拉还提供了对应于其集合类的单例方便方法,Array
也不例外。
因此,如果你可以说List(1,2,3,4,5)
看起来很自然,你也可以说Array(1,2,3,4,5)
。你可以。
但是,它确实让一个稍微尴尬的位置产生了相当不同的结果,具体取决于是否添加了new
这个词。考虑到竞争对手的利益,我认为这是最好的解决方案,但需要一点时间才能适应。
在Scala中管理数组是一种害虫..只有在冷冻基础上开发时才可能使用 – sub 2010-04-23 16:20:14
“冻结基础”?这是真正的阵列治疗从2.7变化到2.8,但我认为我们可以预期它在未来保持稳定。现在Scala Array是Java Array。 Scala的“额外”数组功能是通过implicits来处理的。 – 2010-04-23 16:36:43
这些implicts如何让Array获得更多功能? – 2010-04-23 16:48:47