在 Scala 类定义中使用 `this`

hmi*_*015 3 scala class this apache-spark

我正在阅读 Spark 书中的高级分析,在第二章中它有以下代码片段:

import org.apache.spark.util.StatCounter
class NAStatCounter extends Serializable { 
    val stats: StatCounter = new StatCounter() 
    var missing: Long = 0
    def add(x: Double): NAStatCounter = { 
        if (java.lang.Double.isNaN(x)) {
            missing += 1 
        } else { 
           stats.merge(x)
        }
        this
    }   
    def merge(other: NAStatCounter): NAStatCounter = {
        stats.merge(other.stats)
        missing += other.missing
        this
    }
    override def toString = {
        "stats: " + stats.toString + " NaN: " + missing
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我真的对使用this. 在这两个函数中addmerge它是否指的NAStatCounter是代码定义的原始函数?

书评:

“合并方法将另一个 NAStatCounter 实例跟踪的统计信息合并到当前实例中。这两种方法都返回此值,以便它们可以轻松链接在一起。”

当他们说使用this缓动链接时,他们是什么意思?

Nar*_*pai 5

  1. Scala 中方法的最后一行是返回值。这意味着您不必return this;用多种语言说出您的想法。
  2. 想象一下,函数(添加和合并)的参数不是另一个 NAStateCounter,而是一个字符串或其他一些原语,这可能会有所帮助。该参数与 add 和 merge 方法返回的“this”无关。
  3. 这个上下文中的“this”指向 NAStatCounter 的一个实例,所以当你说类似的话

    var nsCounter = new NAStatCounter()

add 和 merge 方法中的“this”指向实例,即 nsCounter。因此,例如,当您调用 add 时,它会执行它的操作,然后返回 nsCounter,此时您可以调用在 nsCounter 上定义的任何方法。

nsCounter.add(d1).toString()