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
,这两个都被调用来完成程序。
我有一个 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
,这两个都被调用来完成程序。