理解scala中的伴生对象
在学习Scala的过程中,我遇到了一个有趣的伴星对象概念。伴生对象可用于定义Scala中的静态方法。需要在下面的Spark Scala代码中对伴生对象进行一些澄清理解scala中的伴生对象,scala,oop,Scala,Oop,在学习Scala的过程中,我遇到了一个有趣的伴星对象概念。伴生对象可用于定义Scala中的静态方法。需要在下面的Spark Scala代码中对伴生对象进行一些澄清 class BballStatCounter extends Serializable { val stats: StatCounter = new StatCounter() var missing: Long = 0 def add(x: Double): BballStatCounter = { if (
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
方法在这里的意义是什么stats
和missing
是类BcStatCounter
的成员stats
是一个val
,因此一旦定义了它,就不能对其进行更改missing
是一个var
,因此它更像是一个传统变量,可以像在add
方法中一样进行更新。BcStatCounter
的每个实例都将有这些成员。(与Python不同,您不能在Scala对象中添加或删除成员)apply
方法是一种使对象看起来像函数的快捷方式。如果对象x
具有apply
方法,则编写x(…)
,编译器将自动将其转换为x.apply(…)
。在这种情况下,这意味着您可以调用BballStatCounter(1.0)
,这将调用BballStatCounter
对象上的apply
方法stats
和missing
是类BcStatCounter
的成员stats
是一个val
,因此一旦定义了它,就不能对其进行更改missing
是一个var
,因此它更像是一个传统变量,可以像在add
方法中一样进行更新。BcStatCounter
的每个实例都将有这些成员。(与Python不同,您不能在Scala对象中添加或删除成员)apply
方法是一种使对象看起来像函数的快捷方式。如果对象x
具有apply
方法,则编写x(…)
,编译器将自动将其转换为x.apply(…)
。在这种情况下,这意味着您可以调用BballStatCounter(1.0)
,这将调用BballStatCounter
对象上的apply
方法请注意注释中关于询问多个问题的备注。此处的
stats和missing
是类属性,BballStatCounter的每个实例都有自己的副本,就像在Python中一样
在Scala中,方法apply
有一个特殊的用途,如果任何对象都有一个方法apply,并且如果该对象被用作函数调用符号,如Obj(),那么编译器将其替换为其apply方法调用,如Obj.apply()
apply方法通常用作类伴生对象中的构造函数。
Scala中的所有集合类都有一个带有apply方法的伴生对象,因此您可以创建一个类似于:list(1,2,3,4)的列表
因此,在上面的代码中,BballStatCounter(b)将被编译为BballStatCounter。apply(b)这里
stats和missing
是类属性,BballStatCounter的每个实例都有自己的副本,就像在Python中一样
在Scala中,方法apply
有一个特殊的用途,如果任何对象都有一个方法apply,并且如果该对象被用作函数调用符号,如Obj(),那么编译器将其替换为其apply方法调用,如Obj.apply()
apply方法通常用作类伴生对象中的构造函数。
Scala中的所有集合类都有一个带有apply方法的伴生对象,因此您可以创建一个类似于:list(1,2,3,4)的列表
因此,在上述代码中,BballStatCounter(b)将被编译为BballStatCounter.apply(b)您好,欢迎使用。如果你有两个问题,请问两个问题,不要把两个问题放在一个问题里。你的两个问题互不相关,所以很难用一个答案来回答。另外,您的问题中至少有一个已经被多次询问和回答,但由于另一个问题与之交织在一起,因此无法将此问题指向重复的问题。另外,在问题的标题中,您询问了有关同伴对象的问题,但您的两个问题都与同伴对象无关。您好,欢迎来到。如果你有两个问题,请问两个问题,不要把两个问题放在一个问题里。你的两个问题互不相关,所以很难用一个答案来回答。另外,您的问题中至少有一个已经被多次询问和回答,但由于另一个问题与之交织在一起,因此无法将此问题指向重复的问题。另外,在问题的标题中,您询问了有关同伴对象的问题,但这两个问题都与同伴对象无关。