【发布时间】:2017-05-13 23:45:54
【问题描述】:
给你一个最小的例子:
object Main extends JSApp
{
val someThing: String = determineSomething("test")
def main(): Unit =
{
println(someThing)
}
}
现在,这里有两种可能性:
private def determineSomething(s: String): String = "succeeded"
如果项目是这样执行的,那么,我会得到一个日志条目说
成功
但是当我使用更实用的语法时:
private val determineSomething: (s: String) => "succeeded"
我明白了
TypeError: this.determineSomething$1 is null
我很好奇为什么在 (JVM) repl 中会发生这种情况,两种方式都可以正常工作。
【问题讨论】:
-
determineSomething的定义出现在哪里?如果它出现在something的定义之后,那么可能是因为determineSomething那时还没有被初始化。您能否包含该版本代码的完整代码? -
@MikeAllen 将此作为答案,我会接受。我没有意识到这一点,只是希望进入功能性的scala。当然,这是有道理的,但我的印象是编译器会知道它是否是 FunctionX,它必须“全局”可用
-
@Sorona 当您使用
val时,表达式的右侧会被急切(立即)评估。如果当时不存在,则无法调用。在 REPL 中,您可能首先定义了该函数,否则将没有意义,而在实际代码中,您可能采取了相反的方式,这对于懒惰评估的def来说很好,但对于val则不然:) -
@Sorona 我会说相反:在函数式编程中,您应该期望函数的行为与任何其他值一样。