You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: _fr/tour/extractor-objects.md
+56-2
Original file line number
Diff line number
Diff line change
@@ -3,10 +3,64 @@ layout: tour
3
3
title: Extractor Objects
4
4
partof: scala-tour
5
5
6
-
num: 14
6
+
num: 18
7
7
8
8
language: fr
9
9
10
-
next-page: generic-classes
10
+
next-page: for-comprehensions
11
11
previous-page: regular-expression-patterns
12
12
---
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.
caseCustomerID(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
+
valcustomer2ID=CustomerID("Nico")
42
+
valCustomerID(name) = customer2ID
43
+
println(name) // prints Nico
44
+
```
45
+
46
+
C'est équivalent à `val name = CustomerID.unapply(customer2ID).get`.
47
+
48
+
```scala mdoc
49
+
valCustomerID(name2) ="--asdfasdfasdf"
50
+
```
51
+
52
+
S'il n'y a pas de correspondance, une `scala.MatchError` est levée :
53
+
54
+
```scala
55
+
valCustomerID(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 @ _*) =>`.
0 commit comments