【问题标题】:Scala Array constructor?Scala数组构造函数?
【发布时间】:2011-02-11 14:41:40
【问题描述】:
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 中的数组管理是一种害虫。只有在冻结的基础上开发才有可能
  • 一个“冻结的基地?”真正的阵列处理从 2.7 到 2.8 发生了很大变化,但我认为我们可以期待它在此后保持稳定。现在 Scala 数组是 Java 数组。 Scala 的“额外”数组功能是通过隐式处理的。
  • 隐含如何让 Array 获得更多功能?
  • 您可以编写类似Array(1,2,3).map(_ * 0.5) 的东西,它的工作方式就像Array 是Scala 集合的标准部分一样。但在幕后,它被隐式地放置在一个包装器类中,这个包装器就是所谓的map。所以,一方面,Array[X] 确实是 Java 的 X[],另一方面,你可以假装它是 Scala 集合中几乎完全集成的成员。

标签: scala arrays scala-2.8


【解决方案1】:

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

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

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

所以,基本上:

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

【讨论】:

  • @mipadi,如何创建一个具有 10 个插槽和 1 作为默认值的新数组?谢谢
  • @city val a = Array.fill(10){1}
【解决方案2】:

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

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

因此,如果您可以说List(1,2,3,4,5),那么您也可以说Array(1,2,3,4,5) 似乎很自然。你可以。

但它确实让一个人处于稍微尴尬的境地,即根据是否添加单词new 会产生相当不同的结果。考虑到相互竞争的利益,我认为这是总体上最好的解决方案,但确实需要一点时间来适应。

【讨论】:

    猜你喜欢
    • 2013-09-08
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 2013-06-14
    • 2012-01-09
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多