Scala Array构造函数?

时间:2010-04-23 16:17:12

标签: scala arrays scala-2.8

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)

为什么这两个表达式有不同的语义?

2 个答案:

答案 0 :(得分:43)

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

Array同时包含和随附的对象。此外,Array objectapply方法。 apply表示您可以使用Array(arg)创建对象。但是因为Array是一个伴侣类,它还有一个构造函数,可以通过更常用的new Array(arg)机制调用。

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

所以,基本上:

  • 3调用val a = Array [Double] (10) 对象上的apply方法,该方法会创建一个包含给定对象的新数组。
  • Array调用val a = new Array [Double] (10)构造函数,该构造函数创建一个包含10个插槽的新数组,全部初始化为默认值Array

答案 1 :(得分:11)

new Array[Double](10)应该等同于Java中的new double[10]

但Scala还为与其集合类相对应的单例提供了便捷方法,Array也不例外。

因此,如果您可以说List(1,2,3,4,5),您也可以说Array(1,2,3,4,5)。你可以。

但是,根据是否添加单词new,它确实会让人处于稍微尴尬的位置,因为它会产生相当不同的结果。考虑到竞争的利益,我认为这是整体的最佳解决方案,但它确实需要一点点习惯。