理解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 (

在学习Scala的过程中,我遇到了一个有趣的伴星对象概念。伴生对象可用于定义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
    方法在这里的意义是什么
  • stats
    missing
    是类
    BcStatCounter
    的成员
    stats
    是一个
    val
    ,因此一旦定义了它,就不能对其进行更改
    missing
    是一个
    var
    ,因此它更像是一个传统变量,可以像在
    add
    方法中一样进行更新。
    BcStatCounter
    的每个实例都将有这些成员。(与Python不同,您不能在Scala对象中添加或删除成员)

  • apply
    方法是一种使对象看起来像函数的快捷方式。如果对象
    x
    具有
    apply
    方法,则编写
    x(…)
    ,编译器将自动将其转换为
    x.apply(…)
    。在这种情况下,这意味着您可以调用
    BballStatCounter(1.0)
    ,这将调用
    BballStatCounter
    对象上的
    apply
    方法

  • 这两个问题都不是关于伴生对象的,这只是普通的Scala类框架

    请注意评论中关于提问多个问题的备注

  • stats
    missing
    是类
    BcStatCounter
    的成员
    stats
    是一个
    val
    ,因此一旦定义了它,就不能对其进行更改
    missing
    是一个
    var
    ,因此它更像是一个传统变量,可以像在
    add
    方法中一样进行更新。
    BcStatCounter
    的每个实例都将有这些成员。(与Python不同,您不能在Scala对象中添加或删除成员)

  • apply
    方法是一种使对象看起来像函数的快捷方式。如果对象
    x
    具有
    apply
    方法,则编写
    x(…)
    ,编译器将自动将其转换为
    x.apply(…)
    。在这种情况下,这意味着您可以调用
    BballStatCounter(1.0)
    ,这将调用
    BballStatCounter
    对象上的
    apply
    方法

  • 这两个问题都不是关于伴生对象的,这只是普通的Scala类框架


    请注意注释中关于询问多个问题的备注。

    此处的
    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)

    您好,欢迎使用。如果你有两个问题,请问两个问题,不要把两个问题放在一个问题里。你的两个问题互不相关,所以很难用一个答案来回答。另外,您的问题中至少有一个已经被多次询问和回答,但由于另一个问题与之交织在一起,因此无法将此问题指向重复的问题。另外,在问题的标题中,您询问了有关同伴对象的问题,但您的两个问题都与同伴对象无关。您好,欢迎来到。如果你有两个问题,请问两个问题,不要把两个问题放在一个问题里。你的两个问题互不相关,所以很难用一个答案来回答。另外,您的问题中至少有一个已经被多次询问和回答,但由于另一个问题与之交织在一起,因此无法将此问题指向重复的问题。另外,在问题的标题中,您询问了有关同伴对象的问题,但这两个问题都与同伴对象无关。