我有一个包含我可以从日志中确定的代码的类确实正在执行,但我无法弄清楚该方法的调用位置。我想知道,如果一个类定义了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:这很令人尴尬,但看来我一直认为它是一匹马。换句话说......这是我的错误,有问题的代码是不被调用,并且没有任何魔法发生。答案 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
但不是必须的。无论它返回什么,都必须有isEmpty
和get
,这两个都被调用以完成该过程。