scala隐式调用了一些方法吗?

时间:2018-04-12 19:11:53

标签: scala implicit

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

出于隐私原因,我无法分享我的实际代码。以下是完整的BS代码,但我希望人们能够看到我正在谈论的内容。

如果我在我的IDE中查找A.get()方法的用法,则没有。 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:这很令人尴尬,但看来我一直认为它是一匹马。换句话说......这是我的错误,有问题的代码是被调用,并且没有任何魔法发生。

1 个答案:

答案 0 :(得分:2)

我知道隐藏在模式匹配中的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()通常会返回Option但不是必须的。无论它返回什么,都必须有isEmptyget,这两个都被调用以完成该过程。