Scala错误的前向引用错误

Use*_*291 7 error-handling scala compiler-errors

private def foo(a:A):B = a match{
    case A(...) =>
        val x = a.b //error: wrong forward reference a
        ...
}
Run Code Online (Sandbox Code Playgroud)

在A(...)中没有提到b的情况下,如果这很重要.

我在谷歌上试过我的运气,但我似乎只发现有错误涉及前向引用的帖子,但没有解释这个特定错误的实际含义.

如果有人可以帮助我,我将不胜感激.

Use*_*291 18

好吧,我现在不觉得自己很蠢......

private def foo(a:A):B = a match{
    case A(...) =>
        val x = a.b //error: wrong forward reference a
        ...
        val a = ... //<-- THAT's the reason for the error
        ...
}
Run Code Online (Sandbox Code Playgroud)

因此,简单的重命名将解决此问题:

private def foo(aa:A):B = aa match{
    case A(...) =>
        val x = aa.b
        ...
        val a = ...
        ...
}
Run Code Online (Sandbox Code Playgroud)


Pie*_*Pah 5

这里试图解释@User1291 的回答中没有提到的内容。

我是 Scala 和 Java 的新手,所以答案对我来说并不明显。我很惊讶在我的(简化的)代码中遇到了这个错误:

object Main {
  val data = getData()
  def getUser() = {
     getUserFrom(data) // error: Wrong Forward Reference
  }
}
Run Code Online (Sandbox Code Playgroud)

错误的前向引用相当于 Java 的非法前向引用,这是一种奇特的方式,表示您不能引用编译时未知的值。在这种情况下,getData()只能在运行时返回值,并且引用data会出现此错误。

当我尝试更改代码以引用已知字符串时,正如预期的那样,错误消失了:

object Main {
  val name = "PieOhPah"
  def getUser() = {
     getUserFrom(name)
  }
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是用函数关闭该值并从内部访问它,因为函数直到运行时才会计算:

object Main {
  val data = getData()
  def getUser(userData: UserData) = {
     getUserFrom(userData)
  }

  // Invoke the method later with `data`
  print(getUser(data).name) 
}
Run Code Online (Sandbox Code Playgroud)