2017-10-01 10 views
0

현재 스칼라 프로젝트에서 작업 중이며 작은 문제가 발생했습니다.일치 문 스칼라의 사례 개체

저는 현재 일치 선언문을 사용하여 사례 개체의 유형을 결정하고 있습니다. 나는 말함으로써이를 통해 갈거야 :

abstract class Symbol 
case object program extends Symbol 
case object stmt_list extends Symbol 
case object stmt extends Symbol 
case object expr extends Symbol 
case object term_tail extends Symbol 
case object term extends Symbol 
case object factor_tail extends Symbol 
case object factor extends Symbol 
case object add_op extends Symbol 
case object mult_op extends Symbol 


def expected_symToIndex(expected_sym: Symbol): Int = expected_sym match { 

    case program => 0 
    case stmt_list => 1 
    case stmt => 2 
    case expr => 3 
    case term_tail => 4 
    case term => 5 
    case factor_tail => 6 
    case factor => 7 
    case add_op => 8 
    case mult_op => 9 

    } 

이클립스, 이것은 나에게 변수 패턴 후

"패턴이 일치하지 않을 수 없다는 경고를주고있다 (SLS 8.1.1) 을 당신에게하는 경우 패키지의 오브젝트 프로그램과 일치 시키려면 다음과 같이 백틱을 사용해야합니다. ⇒ case program ⇒ "

첫 줄에. 다른 모든 것은 도달 할 수없는 코드입니다.

내 프로그램을 테스트 한 후이 메서드는 항상 0을 반환합니다 (메서드의 첫 번째 사례 개체 줄에서 항상 실행되기 때문에). 나는 케이스 객체 매치 메소드에 대해 조사해 왔지만 여기에서 일어나는 것과 비슷한 많은 자료를 찾지 못했습니다. 나는이 기호들이 그들 자신 안에서 변수가 아니기 때문에 혼란 스럽다. 그것들은 match 문 내부에서 검사 할 유형입니다.

또한 "프로그램"과 다른 테스트 된 값은 작동하지 않습니다. 이 같은 유형을 테스트하려고하면 :

case a: program => 0 

컴파일러에서 "프로그램"유형을 찾을 수 없다고 말합니다.

감사합니다.

+0

봉인 된 특성 대신 추상 클래스를 사용하는 이유가 있습니까? – fuzzycuffs

+0

모든 케이스 오브젝트가 소문자 인 이유는 무엇입니까? 이 모든 대소 문자를 대문자로 만들었을 때 코드가 잘 컴파일되었습니다. – Tanjin

답변

1

대신 case objectcase class을 정의하는 시도도 참조하십시오. 그런 다음 패턴 일치에 사용할 수 있어야합니다.

abstract class Symbol 

case class program() extends Symbol 

case class stmt_list() extends Symbol 

case class stmt() extends Symbol 

case class expr() extends Symbol 

case class term_tail() extends Symbol 

case class term() extends Symbol 

case class factor_tail() extends Symbol 

case class factor() extends Symbol 

case class add_op() extends Symbol 

case class mult_op() extends Symbol 


object Main { 

    def expected_symToIndex(expected_sym: Symbol): Int = expected_sym match { 

    case x: program => 0 
    case x: stmt_list => 1 
    case x: stmt => 2 
    case x: expr => 3 
    case x: term_tail => 4 
    case x: term => 5 
    case x: factor_tail => 6 
    case x: factor => 7 
    case x: add_op => 8 
    case x: mult_op => 9 
    case _ => -1 
    } 

    def main(args: Array[String]): Unit = { 

    println(expected_symToIndex(program())) //prints 0 
    println(expected_symToIndex(stmt_list())) //prints 1 

    } 
} 
+0

괄호를 잊어 버리셨습니까? 그런 식으로 변수 패턴으로 인해 여전히 도달 할 수없는 코드를 얻게됩니다. –

+0

그래, 컴파일을 시도하지 않았습니다. 이제 내 대답을 업데이트했습니다. 이것은 제대로 작동하고 있습니다. – fcat

1

귀하의 programstmt, expr은, 따라서 그들은 값은 유형이없는 object의하지 class ES 다음과 같이 정의된다. 이렇게하면 case a: program =>을 사용할 수없는 이유가 설명됩니다.

또한 스칼라의 대/소문자는 사용자가 설명 한대로 작동하지 않습니다. x match { case a => ... }과 같은 경우 변수를 사용하면 x가 a와 같은지 확인한 다음 실행을 계속하지 않습니다. - 아니요. ANY 값과 일치하고 변수 a에 할당되므로 사용할 수 없습니다. 안쪽 ...은 일치 된 값을 나타냅니다.

설명했듯이 원하는 작업이 아닙니다. 어떤 값과도 일치시키지 않고 대신 특정 변수 값과 일치 시키려면이 x match { case `a` => ... }과 같이 오류 메시지에서 말한대로 백틱을 사용하여 변수를 표시 할 수 있습니다.

또는 objectcase object으로 마킹 할 수 있습니다. 다른 것들 중에서도 일치 항목에 사용할 의도가 있다고 컴파일러에 알립니다.

https://alvinalexander.com/scala/scala-unreachable-code-due-to-variable-pattern-message

+1

일반 '객체'에는 아무 것도 지정할 수 없습니다. 'val에 재 할당 '컴파일 오류가 발생합니다. OP는'case a : program.type =>'을 사용하여 객체의 유형 인 btw와 일치시킬 수 있습니다. –

+0

오른쪽! 불변성에 대한 잘못된 문장을 삭제했습니다. – drcicero