首页 > 解决方案 > 像 3600 * 24 这样的表达式是在编译时评估的吗?

问题描述

在 Scala 中,假设我写

val oneDay = 3600L * 24 // seconds in one day
val twoDay = oneDay * 2 // seconds in two days

oneDay(ie, )的最终值是86400在运行时还是编译时计算的?

的最终值twoDay呢?

标签: scala

解决方案


为了确定最终值,我尝试使用以下方法编译您的代码:

scalac main.scala -Xprint:all

而且,在最后阶段,您的代码变为:

final <synthetic> def delayedEndpoint$Main$1: Unit = {
      Main.this.oneDay = 86400L;
      Main.this.twoDay = Main.this.oneDay().*(2);
      ()
    };

因此,第一个值在编译时计算,而第二个值将在运行时计算。

使用 Scala 3.0,可以使用inline(或final如 @ghik 所述)来生成编译时计算的第二个值。


推荐阅读