在学习Scala时,我遇到了有趣的伴侣对象概念 . Companion对象可用于在Scala中定义静态方法 . 关于伴随对象,在下面的Spark Scala代码中需要做一些澄清 .
class BballStatCounter extends Serializable {
val stats: StatCounter = new StatCounter()
var missing: Long = 0
def add(x: Double): BballStatCounter = {
if (x.isNaN) {
missing += 1
} else {
stats.merge(x)
}
this
}
}
object BballStatCounter extends Serializable {
def apply(x: Double) = new BballStatCounter().add(x)
}
使用 val stat3 = stats1.map(b=>BballStatCounter(b))
调用上面的代码 .
-
类中声明的变量
stats
和missing
的性质是什么?它类似于Python的类属性吗? -
apply
方法在这里有什么意义?
2 回答
这里
stats and missing
是类属性,BballStatCounter的每个实例都有自己的副本,就像在Python中一样 .在Scala中,方法
apply
用于特殊目的,如果任何对象具有方法apply,并且如果该对象用作函数调用符号(如Obj()),则编译器将其替换为其apply方法调用,如Obj.apply() .apply方法通常用作Class Companion对象中的构造函数 . Scala中的所有集合类都有一个带有apply方法的Companion对象,因此您可以创建一个列表,如:List(1,2,3,4)
因此,在上面的代码中,BballStatCounter(b)将被编译为BballStatCounter.apply(b)
stats
和missing
是类BcStatCounter
的成员 .stats
是val
所以一旦定义它就无法更改 .missing
是var
所以它更像传统变量,可以更新,就像在add
方法中一样 .BcStatCounter
的每个实例都将包含这些成员 . (与Python不同,您无法在Scala对象中添加或删除成员)apply
方法是一种使对象看起来像函数的快捷方式 . 如果你有一个带有apply
方法的对象x
,你编写x(...)
,编译器会自动将其转换为x.apply(...)
. 在这种情况下,这意味着您可以调用BballStatCounter(1.0)
,这将调用BballStatCounter
对象上的apply
方法 .这些问题都不是关于伴随对象的,这只是普通的Scala类框架 .
请注意有关提出多个问题的评论中的评论 .