在学习Scala时,我遇到了有趣的伴侣对象概念。伴侣对象可用于在Scala中定义静态方法。在以下Spark Scala代码中,关于伴随对象的说明很少。
SET @holder = (SELECT clndr_data FROM [x].[dbo].[CALENDAR] WHERE clndr_id = '954')
以上代码是使用 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
的本质是什么
类?它类似于Python的类属性吗? missing
方法的意义是什么?答案 0 :(得分:1)
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)
答案 1 :(得分:0)
stats
和missing
是类BcStatCounter
的成员。 stats
是val
,因此一旦定义就无法更改。 missing
是var
,因此它更像是传统变量,可以像add
方法中那样进行更新。 BcStatCounter
的每个实例都将具有这些成员。 (与Python不同,您无法从Scala对象添加或删除成员)
apply
方法是使对象看起来像函数的快捷方式。如果您的对象x
具有apply
方法,则编写x(...)
,编译器会自动将其转换为x.apply(...)
。在这种情况下,这意味着您可以调用BballStatCounter(1.0)
,这将在apply
对象上调用BballStatCounter
方法。
这两个问题都不是关于伴随对象的,这只是普通的Scala类框架。
请注意评论中关于询问多个问题的评论。