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)
  }
}