2015-03-26 2 views
1
private def foo(a:A):B = a match{ 
    case A(...) => 
     val x = a.b //error: wrong forward reference a 
     ... 
} 

Если b не упоминается в A (...), если это имеет значение.Ошибка ошибки прямого сканирования Scala

Я пробовал свою удачу в Google, но я, кажется, нахожу только сообщения людей с ошибками, связанными с прямыми ссылками, но не объясняющими, что на самом деле означает эта конкретная ошибка.

Буду признателен, если кто-то может мне помочь.

+2

До сих пор это выглядит хорошо. Я думаю, что проблема кроется в коде, который не показан. Можете ли вы предоставить самодостаточный пример? – ziggystar

ответ

11

Ну, не сейчас я чувствую себя глупо ...

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 = ... 
     ... 
} 
+0

Спасибо @ User1291, вы спасли мой день! –

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 
    ... 
} 
Смежные вопросы