我正在阅读类 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的用法时,出现了重叠,由此可以断定它们和重载双胞胎一样被认为是同一种方法?但是既然它们有不同的参数,为什么我们需要在标识符上有所不同呢? - 至于调用方法的地方,我的理解正确吗?pos 4 是调用方法定义 1 的地方吗?然后参数的参数仅通过使用“=”传递?
- 如果第二个假设是正确的,那么上面的 pos 0,是不是调用了 Option 的构造函数?这就像调用默认构造函数?
希望任何人都可以帮助我。感谢。