Scala 是否隐式调用某些方法?

does scala implicitly call some methods?

我有一个 class,其中包含我可以从日志中看出确实正在执行的代码,但我无法确定调用该方法的位置。我想知道,如果 class 定义了 get() 方法,它是否会以某种方式自动调用,可能是 class 中的其他代码被执行了? get() 是魔法吗?

出于隐私原因,我不能分享我的实际代码。以下是完整的 BS 代码,但我希望它足以让人们明白我在说什么。

如果我在A.get()方法的IDE中查找用法,则有none。 A.getHistory() 方法的唯一用法是在 A.get() 方法内部。最后还有A.extra()方法的用法

class A(count: Int) {     
  def get (date: LocalDateTime) : List[B] = {
    getHistory(date, 0).get
  }

  def getHistory(date: LocalDateTime, tries: Int) : Try[List[B]] = Try({
    val b : B = new B (date)
    logger.info("method getHistory() is being called")
  }) match {
    case s: Success[List[B]] => s
    case e: Failure[List[UnitChange]] => 
      Thread.sleep(retryDelay)
      getHistory(date, tries + 1)   
  }

  def extra() = {
    logger.info("method extra() is being called")
  }
}

object C {
  def run() {
    A.extra()
  }
}

如果 C.run() 调用 A.extra()A.get() 是否会隐式调用?

U:即使不是真正的 Scala 开发人员,我也必须支持这段代码。但我还需要知道,因为我已经将它移植到 Java,如果方法在 Scala 中被神奇地调用,那不会发生在 Java,我需要做一些改变确保魔术代码确实得到执行。

U: 这很尴尬,但我似乎一直在诊断斑马时诊断它是马。换句话说......这是我的一个错误,有问题的代码 没有 被调用,并且没有魔法发生。

我知道一个 get() 调用隐藏在模式匹配中的例子。我很怀疑这就是您所看到的,但值得了解。

class MyClass(val arg: Int) {
  def get: String = "what it takes"
  def isEmpty: Boolean = false
}
object MyClass {
  def unapply(mc: MyClass): MyClass = mc
}
new MyClass(42) match {
  case MyClass(x) => s"got $x"   //res0: String = got what it takes
  case _          => "not"
}

unapply() 作为模式匹配的一部分被调用。 unapply() 通常 returns 和 Option 但不一定。不管它 returns 必须有一个 isEmpty 和一个 get,这两个都被调用来完成程序。