2017-04-14 39 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之內,在其外部不可見。

我猜,你正在試圖做類似下面

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 

現在RookKnight ......是圖和繼承語義適用於他們。上面的代碼被稱爲聲明代數數據類型。

現在給出一個圖的類型圖,你可以模式匹配,並找到它是什麼樣的數字。

val figure: Figure = Rook() 

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

上述代碼現已生效。根據您想達到

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

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

它的工作,但只有當我將其模式匹配到一給出圖。當我將它與一個List [List [Figure]]模式匹配時,它會說:模式類型與預期類型不兼容;找到:Field.this.Rook.type required:List [List [Field.this.Figure]]。我如何遍歷數字列表中的INSIDE? – 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

由於Pamu解釋你要設置的數字,因爲一個代數數據類型,你的代碼變得

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 

。你可以將它們設置爲對象的情況下case類,而不是因爲你沒有任何屬性:

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