private def foo(a:A):B = a match{
case A(...) =>
val x = a.b //error: wrong forward reference a
...
}
如果A(...)中没有提及b,则重要。
我在Google上试过我的运气,但我似乎只发现有错误涉及前向引用的帖子,但没有解释这个特定错误实际意味着什么。
如果有人可以帮助我,我将不胜感激。
答案 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
...
}
}
在你的情况下......你的功能清楚地表明你的a
是A
- 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
...
}