我正在阅读kafka.core.log.logsegment类的源代码。scala的语法给了我很大的困惑。我知道如果我能系统地学习scala,我可以说得很清楚,但我只是没有太多的时间来完成我的项目。
方法定义:
@volatile private var _maxTimestampSoFar: Option[Long] = None//**#pos 0 constructor??**
def maxTimestampSoFar_=(timestamp: Long): Unit = _maxTimestampSoFar = Some(timestamp)//**definition 1**
def maxTimestampSoFar: Long = {//**definition2**
if (_maxTimestampSoFar.isEmpty)
_maxTimestampSoFar = Some(timeIndex.lastEntry.timestamp)
_maxTimestampSoFar.get
}
它们被称为:
if (largestTimestamp > maxTimestampSoFar) {//**#pos 3.getter**
maxTimestampSoFar = largestTimestamp//**#pos4 set the value?**
offsetOfMaxTimestampSoFar = shallowOffsetOfMaxTimestamp
}
让我困惑的是:
这种方法的标识符后面有一个额外的“\”的用法是什么 maxTimestampSoFar_
. 当我检查定义1和定义2的用法时,出现了重叠,从中我可以得出结论,它们就像重载twins一样被视为同一个方法?但是既然它们有不同的参数,为什么我们需要在标识符上有所不同?
至于方法调用的位置,我的理解正确吗?位置4是调用方法定义1的地方吗?然后参数的参数就通过使用“=”?
如果第二个假设是正确的,那么在上面的位置0,它是选项的构造函数的调用吗?这就像调用默认构造函数?
希望有人能帮我。谢谢你。
1条答案
按热度按时间jaxagkaj1#
方法名也包含等号,所以
maxTimestampSoFar_=
. 这就是在scala中定义setter的方式(参见scala getter/setter-最佳实践?)是的,位置4中的赋值将调用位置1中定义的方法
Option[Long]
可以包含None
或者Some(<long value>)
,代码中的位置0用值初始化变量None