【问题标题】:Def vs. val, functional syntax not working in Scala.js?Def vs. val,函数式语法在 Scala.js 中不起作用?
【发布时间】: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 我会说相反:在函数式编程中,您应该期望函数的行为与任何其他值一样。

标签: scala scala.js


【解决方案1】:

我认为你想要的是这样的:

object Main extends JSApp {
  private val determineSomething: String => String = (s: String) => "succeeded"

  val someThing: String = determineSomething("test")   

  def main(): Unit = {
    println(someThing)
  }
}

determineSomething的声明需要在something的声明之前,否则编译器尝试初始化后者时,前者会未初始化。

【讨论】:

    猜你喜欢
    • 2017-09-19
    • 2015-01-31
    • 2021-10-17
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2020-12-19
    • 2014-04-03
    • 1970-01-01
    相关资源
    最近更新 更多