【问题标题】:Why isn't scala.util.Success.apply infinitely recursive?为什么 scala.util.Success.apply 不是无限递归的?
【发布时间】:2015-10-08 13:22:18
【问题描述】:

scala.util.Success 没有apply 方法,但从scala.util.Try (AFAIK) 继承了该方法。但是scala.util.Try.apply 所做的只是调用Success.apply 并被try catch 块包围。这怎么不是无限递归的?这怎么会触发catch 块?

【问题讨论】:

  • 好的,我看到 Try.apply 的参数是一个函数,因此您正在评估它;但在 Failure.apply 的情况下,参数是 Throwable,我无法追踪 Throwable 和 Function 之间的任何隐式转换。特别是 Throwable 实际上是 java 类,java.lang.Throwable。
  • Try.apply 是按名称调用的函数,如评论所述。所以Try(mayThrowException) 不会在Try 之外进行评估,而是在Try 对象内部的try Success(mayThrowException) 语句内部进行评估,而Sucess 是一个热切评估参数的案例类,mayThrowExecption 在这里完成工作。

标签: scala recursion try-catch


【解决方案1】:

不,scala 的Success 是一个继承abstract class Try案例类。 所以apply方法是scala编译器生成的内置方法,不是继承自对象Try

来源https://github.com/scala/scala/blob/2.11.x/src/library/scala/util/Try.scala#L225

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2019-11-12
    • 2020-12-28
    相关资源
    最近更新 更多