2010-04-23 157 views
16
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数组构造函数?

+0

在Scala中管理数组是一种害虫..只有在冷冻基础上开发时才可能使用 – sub 2010-04-23 16:20:14

+3

“冻结基础”?这是真正的阵列治疗从2.7变化到2.8,但我认为我们可以预期它在未来保持稳定。现在Scala Array是Java Array。 Scala的“额外”数组功能是通过implicits来处理的。 – 2010-04-23 16:36:43

+0

这些implicts如何让Array获得更多功能? – 2010-04-23 16:48:47

回答

42

这是一个有点混乱,但Scala有它可以创建的实例,对象,这基本上是一个类的实例单的概念。它还具有伴随类的概念,它是一对类和具有相同名称的对象。这种机制允许一个“类”实质上具有静态方法,否则在Scala中是不可能的。

Array既有类和同伴对象。此外,Array object有一个apply方法。 apply表示您可以使用Array(arg)创建一个对象。但由于Array是一个伴侣类,它也有一个构造函数,可以通过更常用的机制new Array(arg)来调用。

问题是Array对象中的applyArray构造函数具有不同的语义。 apply方法创建指定对象外的数组,因此,例如,Array(1,2,3)返回由对象1,23组成的数组。另一方面,构造函数接受指定数组维数大小的参数(以便您可以创建多维数组),然后将所有插槽初始化为默认值。

所以,基本上:

  • val a = Array [Double] (10)调用Array对象,它创建包含给定对象的新阵列上的apply方法。
  • val a = new Array [Double] (10)调用Array构造函数,该构造函数创建一个具有10个插槽的新阵列,全部初始化为缺省值0.0
+0

很棒的回答。谢谢! – 2010-04-23 16:47:55

+0

@mipadi,如何创建一个10个插槽和1作为默认值的新阵列?谢谢 – city 2013-10-02 01:40:05

+0

@city'val a = Array.fill(10){1}' – 2016-11-11 19:25:56

10

new Array[Double](10)应该相当于Java中的new double[10]

但斯卡拉还提供了对应于其集合类的单例方便方法,Array也不例外。

因此,如果你可以说List(1,2,3,4,5)看起来很自然,你也可以说Array(1,2,3,4,5)。你可以。

但是,它确实让一个稍微尴尬的位置产生了相当不同的结果,具体取决于是否添加了new这个词。考虑到竞争对手的利益,我认为这是最好的解决方案,但需要一点时间才能适应。