How to read class/object in Scala documentation
我刚学过斯卡拉。
例如,当我阅读官方文档以查找Array时,它有两个版本。一个用于类,另一个用于对象。我想我知道类和对象之间的区别,当我需要查找Array的方法时,我通常使用类版本。我不太清楚什么时候需要使用这个对象版本,当我想要创建多维数组时,我需要对象版本中的方法(ofDim)而不是类版本。为什么?
标识符Array根据上下文,引用类型或其伴生对象。
1 2
| scala> Array('a', 'b', 'c')
res0: Array[Char] = Array(a, b, c) |
res0是Array类型的实例。res0是一个对象。
1 2
| scala > Array
res1 : Array. type = scala. Array$ @1a69136 |
res1是伴生对象。res1是一个对象。它是单例的,意味着没有其他类型的对象。
这两个对象有不同的方法,因为它们是非常不同的东西。
Array类型的实例具有类定义的方法。当然,这些方法是在特定的Array实例上操作的。例如,length方法返回数组的长度。您需要一个实例来执行此操作。写Array.length是没有意义的,因为它没有指定您想要的数组长度。但Array('a', 'b', 'c').length是3。
伴生对象具有由该对象定义的方法。这些方法不需要Array实例。伴生对象将包含创建实例的方法,与Array的情况一样。因此,Array.ofDim(2, 2)创建一个2x2数组。该方法未由类定义,因为实例不应具有该方法。例如,编写Array('a', 'b', 'c').ofDim(2, 2)没有多大意义,因为结果(一个空的2x2数组)与调用该方法的实例无关。
- 可以说,对象定义的方法与Java中的静态方法类似吗?
- 是的,非常喜欢。如果你提到你熟悉Java,我会这么说的;
类方法对类实例数据进行操作。类似于数组类的数组元素。伴生对象方法通常在一个类的多个实例上操作或创建一个实例。
Scala中的对象与Java或C语言中的静态成员具有相同的作用。例如,对于数组,它主要包含工厂方法。我不希望在伴生对象上看到像length或isEmpty这样的方法,另一方面,我希望在类的实例上看到工厂方法。
根据我的理解,类定义了实际的实现,方法是对实例进行操作(在本例中是数组-方法,如map、count、fold等)。
另一方面,伴生对象提供用于创建的实用方法(如apply…)(对于数组,在本例中,它主要包含工厂方法)。