Scala的错误前向引用错误

时间:2015-03-26 08:46:55

标签: scala error-handling compiler-errors

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

如果A(...)中没有提及b,则重要。

我在Google上试过我的运气,但我似乎只发现有错误涉及前向引用的帖子,但没有解释这个特定错误实际意味着什么。

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

3 个答案:

答案 0 :(得分:17)

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

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

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

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

答案 1 :(得分:2)

这是尝试用他/她的答案解释@ User1291没有的内容。

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

object Main {
  val data = getData()
  def getUser() = {
     getUserFrom(data) // error: Wrong Forward Reference
  }
}

错误的前向引用等效于Java的非法前向引用,这是一种奇特的说法,即您不能引用在编译时未知的值。在这种情况下,getData()只能在运行时返回值,而引用data会导致此错误。

当我尝试更改代码以引用已知字符串时,错误消失了:

object Main {
  val name = "PieOhPah"
  def getUser() = {
     getUserFrom(name)
  }
}

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

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

  // Invoke the method later with `data`
  print(getUser(data).name) 
}

答案 2 :(得分:0)

问题是您可能以某种错误的方式使用模式匹配。如...您还没有提供完整的代码。我不知道那是什么错误。

我确信其他地方存在问题,因为以下代码(与您给出的代码几乎相同)完美无瑕地工作,

scala> :pa
// Entering paste mode (ctrl-D to finish)

case class A( c: String ) {
  val b: String = c
}

def demoA( a: A ): String = a match {
  case A( iAmC ) => {
    val x = a.b
    x
  }
}


// Exiting paste mode, now interpreting.

defined class A
demoA: (a: A)String

scala> val anA = A( "sdfsd" )
anA: A = A(sdfsd)

scala> demoA( anA )
res3: String = sdfsd

所以...基本上如果你有一个像下面这样的案例类,

case class A( b: String, c: String )

现在关注会有效。

private def foo( a:A ): B = a match{
  case A( iAmB, iAmC ) => {
    // iAmB and iAmC have values of a.b and a.c repectively
    ...
  }
}

在你的情况下......你的功能清楚地表明你的aA - def foo( a:A )的一个实例所以......你真的不需要在这里进行模式匹配。

private def foo( a:A ): B = {
  // Now class A should have member b and c
  val iAmB = a.b
  val iAmC = a.c
  ...
}