Skip to content

Commit 1a4bfdd

Browse files
author
hg-anssi
committed
Rust type system pitfalls
Fixes #110
1 parent ff48c05 commit 1a4bfdd

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed

book.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
book.toml.en
1+
book.toml.fr

src/fr/typesystem.md

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,39 @@
11
# Système de types
22

3-
<!-- ## À propos du système de types de Rust -->
3+
## Sémantique typée
44

5-
<!--
6-
<mark>TODO</mark> : identifier les pièges du système de types (par exemple,
7-
des confusions à propos du code qui est vraiment exécuté à la suite d'une
8-
résolution de contraintes de traits complexes).
9-
-->
5+
Certains langage (comme OCaml, Java ou C) ont une sémantique majoritairement[^syntax_directed_exceptions] *non typée* car leur exécution n'a pas besoin d'information de type. D'autres langages comme Haskell, Rust ou C++[^cpp_typed] ont majoritairement une sémantique *typée* dans laquelle la sémantique d'une opération dépend de son type.
6+
7+
[^syntax_directed_exceptions]: Les types primitifs de Java utilisent des informations de type pour déterminer leur sémantique. De même, l’arithmétique des tableaux en C utilise les informations de type pour calculer les *offsets*.
8+
[^cpp_typed]: On excepte le cas des méthodes virtuelles.
9+
10+
Par exemple, dans les programmes suivants, l'expression `"127.0.0.1:8080".parse()` dépend du type attendu :
11+
12+
```rust
13+
let r : Result<u8, _> = "127.0.0.1:8080".parse();
14+
println!("{:?}", r);
15+
```
16+
17+
affiche
18+
19+
```
20+
Err(ParseIntError { kind: InvalidDigit })
21+
```
22+
23+
alors que
24+
25+
```rust
26+
let r : Result<std::net::SocketAddr, _> = "127.0.0.1:8080".parse();
27+
println!("{:?}", r);
28+
```
29+
30+
affiche
31+
32+
```
33+
Ok(127.0.0.1:8080)
34+
```
35+
36+
Le compilateur Rust utilise ici l'information de type pour résoudre la fonction `parse`.
37+
38+
<!-- Attention aux implémentations de la même fonction pour un smart pointer et le type qu'il wrap -->
39+
<!-- Attention aux implémentations qui se chevauchent mais pas trop dérangeant car si on ne sait pas qu'un type implémente un trait, on ne va pas l'utiliser dans le cadre de ce trait -->

0 commit comments

Comments
 (0)