Erreur de correspondance Scala
J'ai essayé de remplacer mon isInstanceOf vérifier auprès d'un match, mais ça ne fonctionne pas.
Dans ma méthode je fais un chèque pour un nœud de l'arborescence - si c'est une feuille - je veux retourner à l'intérieur d'un Vecteur tout de suite, si ce n' - je continuer avec la méthode.
Donc, à l'origine, j'ai eu:
//code here
if (common.isInstanceOf[LeafNode]) {
return Vector(common.asInstanceOf[LeafNode].data)
}
//code here
puis j'ai essayé de le remplacer par:
//code here
common match {
case leaf: LeafNode => return Vector(leaf.data)
}
//code here
mais j'ai la scala.MatchError.
source d'informationauteur drozzy
Vous devez vous connecter pour publier un commentaire.
Vous êtes l'obtention d'un
MatchError
dans le cas où votrecommon
n'est pas unLeafNode
. Votreif
etmatch
expressions ne sont pas équivalentes. Je pense que le moyen le plus direct pour les rendre équivalentes:Mais je vous conseille de regarder le tout bloc de code et de travail sont plus fonctionnelle à faire ce travail. C'est, sans le
return
dans le milieu. Rappelez-vous ce match est une expression, de sorte que quelque chose comme ceci est peut-être possible:Le problème est que l'ensemble des cas dans votre
match
bloc n'est pas exhaustive, sicommon
est rien mais uneLeafNode
unMatchError
sera levée. Vous pouvez résoudre ce problème en ayant un fourre-tout cas de cette façon:Ceci est analogue à la
default
cas en Java instruction switch. Leother
cas est appelé un "irréfutable de la tendance" parce qu'il n'a pas de caractéristiques; il n'a pas besoin d'un type particulier ou d'un constructeur, il sera toujours correspondre à tout ce qui passe à travers elle. Le nom de la variable ne doit pas êtreother
il peut être tout ce que vous voulez, ou même_
... en fait, vous n'avez pas besoin de lier une nouvelle variable ici, car il sera identique àcommon
.Sur un point de style, il est généralement mal vu de mettre retour des déclarations à l'intérieur d'un
match
bloc, le bloc entier est une expression qui s'évalue à l'un de ses cas, il suffit donc de renvoyer la totalité de l'expression. Aussi, vous n'avez pas besoin d'utiliser lereturn
mot-clé à tous, comme la dernière expression dans une définition de fonction sera utilisée comme résultat.