2017-09-09 22 views
0

私はCourseraのScalaコースに取り組んでおり、抽象クラスにいくつかの問題があります。ここでは、CodeTree抽象クラスのケースクラスのフィールドにアクセスしようとしていますが、コンパイラはこれらのフィールドがCodeTreeクラス自体に属していないと不平を言っています。私はパターンマッチングはそれを処理すると思うだろうが、明らかにそうではない。どんな助け?スカラ抽象クラス

abstract class CodeTree 
case class Fork(left: CodeTree, right: CodeTree, chars: List[Char], weight: Int) extends CodeTree 
case class Leaf(char: Char, weight: Int) extends CodeTree 

def weight(tree: CodeTree): Int = tree match { 
    case Leaf(_, weight) => tree.weight 
    case Fork(left, right, _, _) => weight(tree.left) + weight(tree.right) 
} 

答えて

1

コンパイラが正しく、抽象クラスにはインスタンス変数がありません。

良いニュースは、あなたがそれらを必要としていないということです。すでにtreeの入力パラメータのパターンマッチングから必要なものがすべてあります。

だけにあなたのコードを変更:

:あなたはとてもScalaでマッチングに成功したパターンマッチング句の左側にある変数は句自体の右側に利用できるが、持っている場合は

abstract class CodeTree 
case class Fork(left: CodeTree, right: CodeTree, chars: List[Char], weight: Int) extends CodeTree 
case class Leaf(char: Char, weight: Int) extends CodeTree 

def weight(tree: CodeTree): Int = tree match { 
    case Leaf(_, weight) => weight 
    case Fork(left, right, _, _) => weight(left) + weight(right) 
} 

あなたがLeafに一致するので、あなたは単にあなたがミリアンペアあなたの第二節では、それ

  • を返し右側に利用できるweight変数を、持っているあなたの最初の句で
    • TCH Forkので、あなたは再帰的にあなたがのより良い理解を持っているScala Tourを参照することができweight機能

    を呼んで、(あなたがcharsweight変数を破棄)右側に利用できるleftright変数を持っていますパターンマッチングの仕組み

  • +0

    素晴らしいです。ありがとう。 – dsaxton

    +0

    私はいくつかのリンクと何が起こっているのかの少しの説明を追加しました。私はScalaが最初は奇妙なことがあることを知っています。 :) –

    関連する問題