Skip to content

Commit 9d9f096

Browse files
authored
Translation for fr/extractor-objects (#2268)
1 parent 4a79b3f commit 9d9f096

File tree

1 file changed

+56
-2
lines changed

1 file changed

+56
-2
lines changed

_fr/tour/extractor-objects.md

+56-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,64 @@ layout: tour
33
title: Extractor Objects
44
partof: scala-tour
55

6-
num: 14
6+
num: 18
77

88
language: fr
99

10-
next-page: generic-classes
10+
next-page: for-comprehensions
1111
previous-page: regular-expression-patterns
1212
---
13+
14+
Un objet extracteur est un objet avec une méthode `unapply`. Tandis que la méthode `apply` ressemble à un constructeur qui prend des arguments et crée un objet, `unapply` prend un object et essaye de retourner ses arguments. Il est utilisé le plus souvent en filtrage par motif (*pattern matching*) ou avec les fonctions partielles.
15+
16+
```scala mdoc
17+
import scala.util.Random
18+
19+
object CustomerID {
20+
21+
def apply(name: String) = s"$name--${Random.nextLong}"
22+
23+
def unapply(customerID: String): Option[String] = {
24+
val stringArray: Array[String] = customerID.split("--")
25+
if (stringArray.tail.nonEmpty) Some(stringArray.head) else None
26+
}
27+
}
28+
29+
val customer1ID = CustomerID("Sukyoung") // Sukyoung--23098234908
30+
customer1ID match {
31+
case CustomerID(name) => println(name) // prints Sukyoung
32+
case _ => println("Could not extract a CustomerID")
33+
}
34+
```
35+
36+
La méthode `apply` crée une chaîne de caractères `CustomerID` depuis `name`. La méthode `unapply` fait l'inverse pour retrouver le `name`. Lorsqu'on appelle `CustomerID("Sukyoung")`, c'est un raccourci pour `CustomerID.apply("Sukyoung")`. Lorsqu'on appelle `case CustomerID(name) => println(name)`, on appelle la méthode `unapply` avec `CustomerID.unapply(customer1ID)`.
37+
38+
Sachant qu'une définition de valeur peut utiliser une décomposition pour introduire une nouvelle variable, un extracteur peut être utilisé pour initialiser la variable, avec la méthode `unapply` pour fournir la valeur.
39+
40+
```scala mdoc
41+
val customer2ID = CustomerID("Nico")
42+
val CustomerID(name) = customer2ID
43+
println(name) // prints Nico
44+
```
45+
46+
C'est équivalent à `val name = CustomerID.unapply(customer2ID).get`.
47+
48+
```scala mdoc
49+
val CustomerID(name2) = "--asdfasdfasdf"
50+
```
51+
52+
S'il n'y a pas de correspondance, une `scala.MatchError` est levée :
53+
54+
```scala
55+
val CustomerID(name3) = "-asdfasdfasdf"
56+
```
57+
58+
Le type de retour de `unapply` doit être choisi comme suit :
59+
60+
* Si c'est juste un test, retourner un `Boolean`. Par exemple, `case even()`.
61+
* Si cela retourne une seule sous-valeur de type T, retourner un `Option[T]`.
62+
* Si vous souhaitez retourner plusieurs sous-valeurs `T1,...,Tn`, groupez-les dans un tuple optionnel `Option[(T1,...,Tn)]`.
63+
64+
Parfois, le nombre de valeurs à extraire n'est pas fixe et on souhaiterait retourner un nombre arbitraire de valeurs, en fonction des données d'entrée. Pour ce cas, vous pouvez définir des extracteurs avec la méthode `unapplySeq` qui retourne un `Option[Seq[T]]`. Un exemple commun d'utilisation est la déconstruction d'une liste en utilisant `case List(x, y, z) =>`. Un autre est la décomposition d'une `String` en utilisant une expression régulière `Regex`, comme `case r(name, remainingFields @ _*) =>`.
65+
66+
Traduit par Antoine Pointeau.

0 commit comments

Comments
 (0)