如何在 Scala 文档中读取类/对象

Posted

技术标签:

【中文标题】如何在 Scala 文档中读取类/对象【英文标题】:How to read class/object in Scala documentation 【发布时间】:2015-02-04 23:29:23 【问题描述】:

我刚学了 Scala。

例如,当我阅读官方文档查找Array时,它有两个版本。一个用于Class,另一个用于Object。我想我知道difference between Class and Object,当我需要Array的查找方法时,我通常会去Class版本。我不太清楚什么时候需要转到这个 Object 版本。似乎当我想创建多维数组时,我需要 Object 版本中的方法(ofDim)而不是类版本。为什么?

【问题讨论】:

【参考方案1】:

标识符Array 指的是类型或其伴随对象,具体取决于上下文。

scala> Array('a', 'b', 'c')
res0: Array[Char] = Array(a, b, c)

res0Array 类型的一个实例。 res0 是一个对象。

scala> Array
res1: Array.type = scala.Array$@1a69136

res1 是伴随对象。 res1 是一个对象。它是一个单例,这意味着没有其他类型的对象。

这两个对象有不同的方法,因为它们是非常不同的东西。

Array 类型的实例具有the methods defined by the class。这些自然是对特定Array 实例进行操作的方法。例如,length 方法返回数组的长度。您需要一个实例来执行此操作。写Array.length 是没有意义的,因为它没有指定你想要哪个数组的长度。但是Array('a', 'b', 'c').length3

伴随对象有the methods defined by the object。这些方法不需要需要Array 实例。伴随对象将对象包含创建实例的方法,Array 就是这种情况。因此Array.ofDim(2, 2) 创建了一个 2x2 数组。该方法不是由类定义的,因为实例不应该有它。例如,写Array('a', 'b', 'c').ofDim(2, 2) 没有多大意义,因为结果(一个空的 2x2 数组)与调用该方法的实例无关。

【讨论】:

我能说对象定义的方法类似于Java中的static methods吗? 是的,非常如此。如果你提到你熟悉 Java,我会这么说;)【参考方案2】:

根据我的理解,该类使用操作实例的方法定义了实际实现(在本例中为 Array - 方法,如 map、count、fold 等)。

另一方面,伴生对象提供了用于创建的实用方法(如 apply...)(对于 Array 在这种情况下它主要包含工厂方法)。

【讨论】:

【参考方案3】:

类方法对类实例数据进行操作。类似于 Array 类的数组元素。伴随对象方法通常在一个类的多个实例上操作或创建一个。

Scala 中的伴生对象与 Java 或 C# 中的静态成员的作用相同。例如,对于 Array 它主要包含工厂方法。我不希望在伴随对象上看到像 lengthisEmpty 这样的方法,另一方面,我希望在类的实例上看到工厂方法。

【讨论】:

以上是关于如何在 Scala 文档中读取类/对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 EMR 上使用 Spark 3 为 Scala 对象解决“加载类失败”

如何在宏中获取Scala-macro-annotated类或对象的扩展类路径?

如何在 Scala 中测试对象的私有方法

如何在 Scala 中读取环境变量

如何在Scala中将rdd对象转换为数据框

让我们畅通无阻:在 Scala 中使用 GSON 读取 Json