1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
|
---
language: rust
contributors:
- ["P1start", "http://p1start.github.io/"]
translators:
- ["Ryan Rembert", "http://jrrembert.github.io"]
filename: learnrust-fr.rs
lang: fr-fr
---
Rust est un langage de programmation développé par Mozilla Research. Rust combine le contrôle de bas niveau sur la performance avec la commodité et la sécurité garanties de haut niveau.
Il atteint ces objectifs sans avoir besoin d'un ramasse-miettes ou environnement d'exécution, ce qui rend possible l'utilisation de bibliothèques Rust comme une substitution directe pour C.
La première version de Rust, 0.1, est sortie en janvier 2012 et a tellement évolué rapidement que jusqu'à récemment, l'utilisation de versions stables était déconseillée - à la place ce était conseillé d'utiliser les nightly builds.
Le 15 mai 2015, Rust 1.0 a été libéré avec une garantie complète de compatibilité ascendante. Améliorations aux temps de compilation et d'autres aspects du compilateur sont actuellement disponibles dans la nightly builds. Rust a adopté un modèle de libération à bord du train avec les versions régulières toutes les six semaines. Rust 1.1 beta a été mis à la disposition dans le même temps de la libération de Rust 1.0.
Bien que Rust soit un langage relativement bas niveau, Rust a quelques concepts fonctionnels qui se trouvent généralement dans les langues de niveau supérieur. Cela rend Rust non seulement rapide, mais aussi efficace et facile à coder.
```rust
// Ceci est un commentaire. commentaires de ligne ressemblent à ceci ...
// Et prolonger plusieurs lignes comme celle-ci.
/// Les commentaires de documentation ressemblent à ceci et à soutenir
/// la notation de démarques.
/// # Exemples
///
/// ```
/// let cinq = 5
/// ```
///////////////
// 1. Basics //
///////////////
// Les fonctions
// `I32` est le type 32 bits entiers signés
fn add2(x: i32, y: i32) -> i32 {
// Retour implicite (pas virgule)
x + y
}
// Fonction principale
fn main() {
// Nombres //
// Reliures immutable
let x: i32 = 1;
// Entier suffixes/float
let y: I32 = 13i32;
let f: f64 = 1.3f64;
// Type Inférence
// La plupart du temps, le compilateur Rust peut déduire le type de variable
// est, donc vous ne devez pas écrire une annotation de type explicite.
// Tout au long de ce tutoriel, les types sont explicitement annotées dans
// de nombreux endroits, mais seulement à des fins de démonstration.
// L'inférence de type peut gérer cela pour vous la plupart du temps.
let implicit_x = 1;
let implicit_f = 1,3;
// Arithmétique
let somme = x + y + 13;
// Variable Mutable
let mut mutable = 1;
let mutable = 4;
let mutable += 2;
// Chaînes //
// Littéraux chaîne
let x: &str = "Bonjour tout le monde!";
// Impression
println!("{} {}", f, x); // 1.3 Bonjour tout le monde
// A `Chaîne` - une chaîne de tas alloué
let s: String = "Bonjour tout le monde".to_string();
// Une tranche de chaîne - une vue immutable dans une else chaîne.
// Ceci est essentiellement un pointeur immutable à une chaîne - il n'a pas
// contient effectivement le contenu d'une chaîne, juste un pointeur vers
// quelque chose qui fait(dans ce cas, `s`).
let s_slice: &str = &s;
println!("{} {}", s, s_slice); // Bonjour monde Bonjour tout le monde
// Vecteurs/tableau //
// Un tableau de taille fixe
let four_ints: [i32; 4] = [1, 2, 3, 4];
// Un tableau dynamique(vecteur)
let mut vecteur: Vec<i32> = vec![1, 2, 3, 4];
vecteur.push(5);
// Une tranche - une vue immutable dans un vecteur ou un tableau.
// Ceci est un peu comme une tranche de chaîne, mais pour les vecteurs.
let tranche: &[i32] = &vecteur;
// Utiliser `{:?}` pour imprimer quelque chose de débogage de style
println!("{:?} {:?}", vecteur, tranche); // [1, 2, 3, 4, 5] [1, 2, 3, 4, 5]
// Tuples //
// Un tuple est un ensemble de valeurs de peut-être différents types.
// de taille fixe
let x:(i32, &str, f64) = (1, "bonjour", 3.4);
// Déstructurante `let`
let (a, b, c) = x;
println!("{} {} {}", a, b, c); // 1 bonjour 3.4
// indexation
println!("{}", x.1); // Bonjour
//////////////
// 2. Types //
//////////////
// Struct
struct Point {
x: i32,
y: i32,
}
let origine: Point = Point { x: 0, y: 0 };
// Un struct avec des champs sans nom, appelé 'tuple struct'.
struct Point2(i32, i32);
let origine2 = Point2(0, 0);
// Basic C-like enum
enum Direction {
Àgauche,
Droite,
En_Haut,
Vers_Le_Bas,
}
let en_haut = Direction::En_Haut;
// Enum avec des champs
enum OptionnelI32 {
AnI32(I32),
Rien,
}
let deux: OptionnelI32 = OptionnelI32::AnI32(2);
let rien = OptionnelI32::Rien;
// Generics //
struct Foo<T> { bar: T }
// Ceci est défini dans la bibliothèque standard comme `Option`.
enum Optionnel<T> {
SomeVal(T),
NoVal,
}
// Méthodes //
impl<T> Foo<T> {
// Méthodes prennent un paramètre explicite `de self`.
fn get_bar(self) -> T {
self.bar
}
}
let a_foo = Foo { bar: 1 };
println!("{}", a_foo.get_bar()); // 1
// Traits (connu sous le nom des interfaces ou des classes de types dans
// d'autres langues).
trait Frobnicate<T> {
fn frobnicate(self) -> Option<T>;
}
impl<T> Frobnicate<T> for Foo<T> {
fn frobnicate(self) -> Option<T> {
Some(self.bar)
}
}
let another_foo = Foo { bar: 1 };
println!("{:?}", another_foo.frobnicate()); // Some(1)
/////////////////////////
// 3. Motif correspondant //
/////////////////////////
let foo = OptionnelI32::AnI32(1);
match foo {
OptionnelI32::AnI32(n) => println!("Il est un i32: {}", n),
OptionnelI32::Rien => println!("Il n'y a rien!"),
}
// Motif avancé correspondant
struct FooBar { x: i32, y: OptionnelI32 }
let bar = FooBar { x: 15, y: OptionnelI32::AnI32(32) };
match bar {
FooBar { x: 0, y: OptionnelI32 :: AnI32(0)} =>
println!("Les chiffres sont nuls!"),
FooBar { x: n, y: OptionnelI32 :: AnI32(m)} if n == m =>
println!("Les chiffres sont les mêmes"),
FooBar { x: n, y: OptionnelI32 :: AnI32(m)} =>
println!("Différents numéros: {} {}", n, m)!,
FooBar { x: _, y: OptionnelI32 :: Rien} =>
println!("Le deuxième numéro est rien!"),
}
/////////////////////
// 4. Flux de contrôle //
/////////////////////
// `for` boucles / itération
let array = [1, 2, 3];
for i in array.iter() {
println!("{}", i);
}
// Ranges
for i in 0u32..10 {
print!("{}", i);
}
println!("");
// imprime `0 1 2 3 4 5 6 7 8 9`
// `if`
if 1 == 1 {
println!("Maths est travaille!");
} else {
println!("Oh non ...!");
}
// `if` comme expression
let valeur = if true {
"bien"
} else {
"mal"
};
// `while` boucle
while 1 == 1 {
println!("L'univers fonctionne normalement.");
}
// Boucle infinie
loop {
println!("Bonjour!");
}
/////////////////////////////////
// 5. Sécurité & pointeurs mémoire //
/////////////////////////////////
// Pointeur occasion - une seule chose peut "posséder" pointeur à un moment.
// Cela signifie que lorsque le `Box` laisse son champ d'application, il
// peut être automatiquement libérée en toute sécurité.
let mut mine: Box<i32> = Box::new(3);
*mine = 5; // déréférencer
// Ici, `now_its_mine` prend possession de `mine`. En d'autres termes,
// `mine` est déplacé.
let mut now_its_mine = mine;
*now_its_mine += 2;
println!("{}", now_its_mine); // 7
// println!("{}", now_its_mine); // Cela ne compile pas parce
// que `now_its_mine` possède maintenant le pointeur
// Référence - un pointeur immutable qui fait référence à d'autres données.
// Quand une référence est prise à une valeur, nous disons que la valeur
// a été "emprunté".
// Même si une valeur est emprunté immutablement, il ne peut pas être
// muté ou déplacé.
// Un emprunt dure jusqu'à la fin de la portée, il a été créé.
let mut var = 4;
var = 3;
let ref_var: &i32 = &var;
println!("{}", var); // Contrairement à `mine`, `var` peut encore être utilisé
println!("{}", *ref_var);
// Var = 5; // Cela ne compile pas parce que `var` est emprunté.
// *ref_var = 6; // Ce ne serait pas correct non plus, parce que `ref_var` est une
// référence immutable.
// Référence Mutable
// Même si une valeur est empruntée de façon mutable, elle ne peut pas être
// accessible à tous.
let mut var2 = 4;
let ref_var2: &mut i32 = &mut var2;
// '*' est utilisé pour pointer vers le var2 mutably emprunté.
*ref_var2 += 2;
println!("{}", * ref_var2); // 6, // var2 ne compilerait pas.
// ref_var2 est de type &mut i32 donc stocke la référence à i32,
// pas la valeur.
// var2 = 2; // Cela ne compile pas parce que `var2` est emprunté.
}
```
## Autres lectures
Il y a beaucoup plus à Rust -- ce est juste l'essentiel de Rust afin que vous puissiez comprendre
les choses les plus importantes. Pour en savoir plus sur Rust, lire [La Programmation Rust
Langue](http://doc.rust-lang.org/book/index.html) et etudier la
[/r/rust](http://reddit.com/r/rust) subreddit. Les gens sur le canal de #rust sur
irc.mozilla.org sont aussi toujours prêts à aider les nouveaux arrivants.
Vous pouvez également essayer caractéristiques de Rust avec un compilateur en ligne sur le fonctionnaire
[Rust parc](http://play.rust-lang.org) ou sur la principale
[Site Rust](http://rust-lang.org).
|