0

我正在阅读类 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
      }

让我感到困惑的可以总结为以下几点:

  1. 这种方法的用途是什么,在方法的标识符后面加上一个额外的“_”,比如这里:maxTimestampSoFar_. 在检查定义1和定义2的用法时,出现了重叠,由此可以断定它们和重载双胞胎一样被认为是同一种方法?但是既然它们有不同的参数,为什么我们需要在标识符上有所不同呢?
  2. 至于调用方法的地方,我的理解正确吗?pos 4 是调用方法定义 1 的地方吗?然后参数的参数仅通过使用“=”传递?
  3. 如果第二个假设是正确的,那么上面的 pos 0,是不是调用了 Option 的构造函数?这就像调用默认构造函数?

希望任何人都可以帮助我。感谢。

4

1 回答 1

2
  1. 方法名称也包含等号,所以也是maxTimestampSoFar_=。这就是在 Scala 中定义 setter 的方式(参见Scala getters/setters - best practice?
  2. 是的,在 pos 4 中看起来像赋值的东西将调用在 1 中定义的方法
  3. Option[Long]可以包含NoneSome(<long value>),代码中的 pos 0 用值初始化变量None
于 2020-04-27T06:40:33.587 回答