8
votes

Est-ce une règle que cela va toujours renvoyer une option?

J'ai essayé de créer une méthode unapply à utiliser dans la correspondance de motif, et j'ai essayé de le faire renvoyer quelque chose de différent de Option , cependant, Eclipse montre que comme une erreur . Est-ce une règle que non applique doit renvoyer une option [t] ?

Edit: Voici le code que j'essaie d'utiliser. J'ai commuté le code de la section précédente de sorte que non apply renvoie un booléen xxx

Eclipse dit Nombre incorrect d'arguments pour Numéro d'objetMatcher . Pourquoi est-ce?


0 commentaires

4 Réponses :


8
votes

Jetez un oeil à ce exemple à nouveau. Je cite

Le type de retour d'un peu applique doit être choisi comme suit:
* Si c'est juste un test, renvoyez un booléen. Par exemple cas même ()
* S'il renvoie une seule sous-valeur de type T, renvoyez une option [t]
* Si vous souhaitez renvoyer plusieurs sous-valeurs T1, ..., TN, les groupez-les dans une option de tuple optionnelle [(T1, ..., TN)].


2 commentaires

Pouvez-vous me montrer ce que je devrais modifier pour que l'UNAPPLY qui retourne un booléen au travail?


Vous ne pouvez pas extraire un argument lors du retour des booléens. C'est juste Numéro de casmatcher () => ... .



11
votes

Si vous souhaitez renvoyer quelque chose avec non apply , renvoyez-le à l'intérieur quelques . Retour Boolean Tests simplement si la correspondance peut être faite ou non.

Voici comment une correspondance de motif est traduite: xxx

supposant NumériquesMatcher renvoie option [...] , il fera: xxx

si NumberMatcher retourne Boolean, alors vous pouvez avoir reçu quelque chose. Dans ce cas, c'est ce qui se passe: xxx

devient xxx

Notez que ceci est un très superficiel explication. Les correspondances de cas peuvent tester les constantes, avoir des conditions de garde supplémentaires, des alternatives, une utilisation unapply récursivement, utilisez unapplyseq , etc. Ici, je n'ai montré que l'utilisation très basique pour répondre à une spécificité question. Je conseille fortement de chercher une explication plus complète de la correspondance des motifs.


0 commentaires

1
votes

Lorsque vous avez défini non apply pour renvoyer un booléen , vous indiquiez que le motif n'a pas de caractères génériques pour correspondre (ou lier). Donc, la déclaration de cas pour ce non contracteur doit être Numéro de casmatcher => println (str) et lui donner une variable à remplir est incorrect.

Alternativement, pour créer NumberateMatcher (Groupe) => println (groupe) Vous devez définir non apply () pour renvoyer option [string]


0 commentaires

-2
votes
package com.tutorial.extracters
object ExtracterwithBooleanReturnType extends App {
import java.util.regex._
object NumberMatcher {
  def apply(x: String*) = {
    x
  }
  def unapply(x: String): Option[Boolean] = {
    val pat = Pattern.compile("\\d+")
    val matcher = pat.matcher(x)
    return Some(matcher.find)
 }
}

val strings = NumberMatcher("geo12", "neo493", "leo")
for (str <- strings) {
  str match {
  case NumberMatcher(group) => println(group)
  case _ => println("no")
}
}
}
we can achieve this with above code as well

0 commentaires