2017-04-14 1 views
1

"인물 일치"에서 사례 클래스 King에 액세스하는 것이 왜 사례 클래스가 발견되지 않았습니까?사례 클래스 값을 찾을 수 없음

class Field { 
    val size: Int = StdIn.readInt() 
    var matrix: List[List[Boolean]] = List.fill(size, size)(true) 
    val figures: List[List[Figure]] = List() 

    def inRange(figures: List[List[Figure]]) = { 
     figures match { 
      case King() => field.forEach(matrix) { 
       if (matrix == true) { 
        if (Math.abs(m1-m2) <= 1 || Math.abs(n1-n2) <= 1) matrix = false 
       } 
      } 
     } 
    } 

    abstract class Figure { 
     case class Rook() 
     case class Knight() 
     case class Bishop() 
     case class Queen() 
     case class King() 

    } 

답변

1

King은 추상 클래스 Figure 안에 있으며 외부에서 볼 수 없습니다. 내 생각

, 당신은 지금 Rook, Knight이 ... 그림이며, 상속 의미가 그들에게 적용
trait Figure 

case class Rook() extends Figure 
case class Knight() extends Figure 
case class Bishop() extends Figure 
case class Queen() extends Figure 
case class King() extends Figure 

아래 그런 짓을하려고합니다. 위의 코드는 대수 데이터 형식 선언이라고합니다.

이제 Figure 유형의 그림이 주어지면 패턴 일치를 통해 정확히 어떤 그림인지 찾을 수 있습니다.

val figure: Figure = Rook() 

figure match { 
case Rook() => "found Rook" 
case _ => "Not Rook" 
} 

위 코드는 현재 유효합니다. 귀하의 코드는 Pamu은 당신이 algebric 데이터 형식으로 도면을 설정할 설명했듯이

val listOfFigures: List[List[Figure]] = .... 

listOfFigures.flatMap { figures => 
    figures.map { figure => 
    figure match { 
    case Rook() => "Rook logic" 
    case _ => "Some other logic" 
    } 
    } 
} 
+0

그것은 작동하지 않습니다,하지만 난 하나에 패턴과 일치하는 경우에만 주어진 그림. 패턴 [List] [List] [List]에 패턴 일치하면 패턴 유형이 예상 유형과 호환되지 않습니다. 발견 : Field.this.Rook.type required : List [List [Field.isis.Figure]]. 인물 목록을 어떻게 추적합니까? – Megoh

+0

@Megoh 실수로 유감스럽게 생각합니다. 패턴 일치를 위해서는 내부 값으로 가야합니다. 확인 코드를 수정하십시오. – pamu

1

문제는 King는 추상 클래스 Figure 내부에 정의되어있다 : "값 왕을 찾을 수 없습니다." 나는 당신이 찾고있는 것이 상속이라고 생각합니다. 그것을 달성하기 위해 extends를 사용

abstract class Figure 
case class Rook() extends Figure 
case class Knight() extends Figure 
case class Bishop() extends Figure 
case class Queen() extends Figure 
case class King() extends Figure 

또한, 나는 당신이 등 루크, 나이트,

나는이 당신을 도움이되기를 바랍니다에 매개 변수가 필요하지 않은 경우 case object의 대신 case class ES를 사용하는 것이 좋습니다 것입니다.

1

을 달성하려고하는 내용에 따라

abstract class Figure //Figure can be trait as well. 

case class Rook() extends Figure 
case class Knight() extends Figure 
case class Bishop() extends Figure 
case class Queen() extends Figure 
case class King() extends Figure 

된다. 케이스는 케이스 클래스 대신 객체로 당신이 어떤 속성을 가지고 있지 않기 때문에 당신은 그 (것)을 설정할 수 있습니다

trait Figure 

case object Rook extends Figure 
case object Knight extends Figure 
case object Bishop extends Figure 
case object Queen extends Figure 
case object King extends Figure 

다음

val figures: List[List[Figure]] = List() 

def inRange(figures: List[List[Figure]]) = { 
    val f = figures.flatMap(identity) 
    f.map { 
     case King => field.forEach(matrix) { 
     if (matrix == true) { 
      if (Math.abs(m1 - m2) <= 1 || Math.abs(n1 - n2) <= 1) matrix = false 
     } 
     } 
    } 
} 
관련 문제