2017-09-09 4 views
0

Je travaille sur un cours Scala de Coursera et j'ai quelques problèmes avec les classes abstraites. Ici j'essaye d'accéder aux champs des classes de cas de la classe abstraite CodeTree, mais le compilateur se plaint que ces champs n'appartiennent pas à la classe CodeTree elle-même. Je penserais que l'appariement des motifs prendrait soin de cela, mais apparemment, ce n'est pas le cas. De l'aide?Scala abstract classes

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

Répondre

1

Le compilateur a raison, votre classe abstraite n'a pas de variables d'instance. Les bonnes nouvelles sont que vous n'avez pas besoin d'eux, vous avez déjà tout ce dont vous avez besoin de la correspondance de modèle du tree paramètre d'entrée.

Il suffit de modifier votre code dans:

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

Lorsque vous avez un modèle réussi correspondant à Scala variables sur le côté gauche d'une clause de correspondance sont disponibles sur le côté droit de la clause elle-même, donc:

  • Dans votre première clause vous correspondre à un Leaf et si vous avez la disposition variable de weight sur le côté droit, qui retourne simplement
  • Dans votre deuxième article vous suis un tch un Fork et si vous avez un left et right variables disponibles sur le côté droit (vous défaussez les variables chars et weight), qui font appel récursive la fonction weight

Vous pouvez consulter Scala Tour d'avoir une meilleure compréhension comment le matching fonctionne.

+0

Génial, cela fonctionne. Merci. – dsaxton

+0

J'ai ajouté quelques liens et une petite explication de ce qui se passe. Je sais que Scala peut être étrange au début. :) –