Def与val,函数语法在Scala.js中不起作用?
给你一个简单的例子:Def与val,函数语法在Scala.js中不起作用?,scala,scala.js,Scala,Scala.js,给你一个简单的例子: object Main extends JSApp { val someThing: String = determineSomething("test") def main(): Unit = { println(someThing) } } 现在,这里有两种可能性: private def determineSomething(s: String): String = "succeeded" 如果项目是这样执行的,那么,
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中,这两种方法都可以很好地工作。我认为您想要的是这样的:
determinesemething
的声明必须在something
的声明之前,否则当编译器试图初始化后者时,前者将被取消初始化。我认为您想要的是这样的:
determineSomething
的声明必须在something
的声明之前,否则当编译器尝试初始化后者时,前者将被取消初始化。哪里会出现determineSomething
的定义?如果它出现在某物
的定义之后,那么可能是因为确定方法
在该点上尚未初始化。你能为你的代码版本提供完整的代码吗?@MikeAllen回答这个问题,我会接受的。我没有意识到这一点,只是希望进入功能scala。当然,这是有道理的,但我的印象是,编译器会知道它是否是FunctionX,它必须“全局”可用@Sorona当您使用val
时,表达式的右侧会立即进行求值。如果它当时不存在,您不能调用它。在REPL中,您可能首先定义了函数,否则就没有意义了,而在实际代码中,您可能走了相反的路,这对于延迟计算的def
,是很好的,但对于val
:)@Sorona,情况并非如此,我想说的是相反的:在函数式编程中,你应该期望函数的行为与任何其他值一样。确定方法的定义出现在哪里?如果它出现在某物
的定义之后,那么可能是因为确定方法
在该点上尚未初始化。你能为你的代码版本提供完整的代码吗?@MikeAllen回答这个问题,我会接受的。我没有意识到这一点,只是希望进入功能scala。当然,这是有道理的,但我的印象是,编译器会知道它是否是FunctionX,它必须“全局”可用@Sorona当您使用val
时,表达式的右侧会立即进行求值。如果它当时不存在,您不能调用它。在REPL中,您可能首先定义了函数,否则就没有意义了,而在实际代码中,您可能走了相反的路,这对于延迟计算的def
,是很好的,但对于val
:)@Sorona,情况并非如此,我想说的恰恰相反:在函数式编程中,您应该期望函数的行为与任何其他值一样。
object Main extends JSApp {
private val determineSomething: String => String = (s: String) => "succeeded"
val someThing: String = determineSomething("test")
def main(): Unit = {
println(someThing)
}
}