45 votes

Scala a-t-il des gardiens ?

J'ai commencé à apprendre scala il y a quelques jours et en l'apprenant, je le compare avec d'autres logiciels. programmation fonctionnelle des langues comme ( Haskell , Erlang ) que je connaissais déjà un peu. Est-ce que Scala a gardien séquences disponibles ?

Je suis passé par le pattern matching en Scala, mais existe-t-il un concept équivalent à celui des gardes avec otherwise et tout le reste ?

54voto

Nathan Sanders Points 10641

Oui, il utilise le mot-clé if . De la Classes de cas de A Tour of Scala, vers le bas :

def isIdentityFun(term: Term): Boolean = term match {
  case Fun(x, Var(y)) if x == y => true
  case _ => false
}

(Cela n'est pas mentionné dans le Correspondance de motifs (peut-être parce que le Tour est une vue d'ensemble très rapide).


En Haskell, otherwise est en fait une variable liée à True . Il n'ajoute donc aucune puissance au concept de correspondance de motifs. Vous pouvez l'obtenir simplement en répétant votre motif initial sans la garde :

// if this is your guarded match
  case Fun(x, Var(y)) if x == y => true
// and this is your 'otherwise' match
  case Fun(x, Var(y)) if true => false
// you could just write this:
  case Fun(x, Var(y)) => false

19voto

sepp2k Points 157757

Oui, il existe des gardes-modèles. Ils sont utilisés comme suit :

def boundedInt(min:Int, max: Int): Int => Int = {
  case n if n>max => max
  case n if n<min => min
  case n => n
}

Notez qu'au lieu d'un otherwise -il suffit de spécifier le motif sans garde.

9voto

Shaun Points 2632

La réponse est simple : non. Ce n'est pas exactement ce que vous recherchez (une correspondance exacte avec la syntaxe Haskell). Vous devriez utiliser l'instruction "match" de Scala avec une garde, et fournir un joker, comme :

num match {
    case 0 => "Zero"
    case n if n > -1 =>"Positive number"
    case _ => "Negative number"
}

4voto

cevaris Points 1145

Je suis tombé sur ce post en cherchant comment appliquer les gardes aux correspondances avec plusieurs arguments, ce n'est pas vraiment intuitif, donc j'ajoute un exemple aléatoire ici.

def func(x: Int, y: Int): String = (x, y) match {
  case (_, 0) | (0, _)  => "Zero"
  case (x, _) if x > -1 => "Positive number"
  case (_, y) if y <  0 => "Negative number"
  case (_, _) => "Could not classify"
}

println(func(10,-1))
println(func(-10,1))
println(func(-10,0))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X