Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • fix_formatting
  • main
  • update_2024
3 results

Target

Select target project
  • orestis.malaspin/rust-101
  • tom.andrivet/rust-101
2 results
Select Git revision
  • main
1 result
Show changes
Commits on Source (26)
Showing
with 232 additions and 58 deletions
...@@ -6,13 +6,13 @@ before_script: ...@@ -6,13 +6,13 @@ before_script:
- apt update && apt upgrade -y - apt update && apt upgrade -y
- apt install curl unzip xz-utils -y - apt install curl unzip xz-utils -y
- mkdir -p $HOME/.cargo/bin - mkdir -p $HOME/.cargo/bin
- curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.31/mdbook-v0.4.31-x86_64-unknown-linux-musl.tar.gz | tar -xz --directory=$HOME/.cargo/bin - curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.40/mdbook-v0.4.40-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=$HOME/.cargo/bin
- curl -L https://github.com/Michael-F-Bryan/mdbook-linkcheck/releases/download/v0.7.7/mdbook-linkcheck.x86_64-unknown-linux-gnu.zip -o mdbook-linkcheck.zip - curl -L https://github.com/Michael-F-Bryan/mdbook-linkcheck/releases/download/v0.7.7/mdbook-linkcheck.x86_64-unknown-linux-gnu.zip -o mdbook-linkcheck.zip
- unzip mdbook-linkcheck.zip -d $HOME/.cargo/bin && chmod +x $HOME/.cargo/bin/mdbook-linkcheck - unzip mdbook-linkcheck.zip -d $HOME/.cargo/bin && chmod +x $HOME/.cargo/bin/mdbook-linkcheck
- curl -sSL https://github.com/ferrous-systems/mdslides/releases/download/v0.3.0/mdslides-v0.3.0-x86_64-unknown-linux-gnu.tar.xz | tar -xJ "mdslides-v0.3.0-x86_64-unknown-linux-gnu/mdslides" && mv mdslides-v0.3.0-x86_64-unknown-linux-gnu/mdslides $HOME/.cargo/bin/ && rm -r mdslides-v0.3.0-x86_64-unknown-linux-gnu - curl -sSL https://github.com/ferrous-systems/mdslides/releases/download/v0.4.0/mdslides-x86_64-unknown-linux-gnu.tar.xz | tar -xJ --directory=$HOME/.cargo/bin/ --strip-components 1
- rustup component add rustfmt - rustup component add rustfmt
- rustup component add clippy - rustup component add clippy
- curl -L https://github.com/HollowMan6/mdbook-pdf/releases/download/v0.1.8/mdbook-pdf-v0.1.8-x86_64-unknown-linux-gnu -o $HOME/.cargo/bin/mdbook-pdf - curl -L https://github.com/HollowMan6/mdbook-pdf/releases/download/v0.1.10/mdbook-pdf-v0.1.10-x86_64-unknown-linux-gnu -o $HOME/.cargo/bin/mdbook-pdf
- chmod +x $HOME/.cargo/bin/mdbook-pdf - chmod +x $HOME/.cargo/bin/mdbook-pdf
- mkdir -p $HOME/bin - mkdir -p $HOME/bin
- curl -L https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -o $HOME/bin/chrome.deb - curl -L https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -o $HOME/bin/chrome.deb
...@@ -71,6 +71,13 @@ build:book: ...@@ -71,6 +71,13 @@ build:book:
- mdbook test - mdbook test
- mdbook build - mdbook build
build:exercises:
stage: build
script:
- cd exercises
- mdbook test
- mdbook build
build:slides: build:slides:
stage: build stage: build
script: script:
...@@ -87,6 +94,16 @@ deploy:book: ...@@ -87,6 +94,16 @@ deploy:book:
- mdbook build - mdbook build
- rsync -avz book/html/* ur1bg_malas@ur1bg.ftp.infomaniak.com:web/malaspinas/rust-101/book/ - rsync -avz book/html/* ur1bg_malas@ur1bg.ftp.infomaniak.com:web/malaspinas/rust-101/book/
deploy:exercises:
stage: deploy
only:
- main
- merge_request
script:
- cd exercises
- mdbook build
- rsync -avz book/html/* ur1bg_malas@ur1bg.ftp.infomaniak.com:web/malaspinas/rust-101/exercises/
deploy:slides: deploy:slides:
stage: deploy stage: deploy
only: only:
......
...@@ -3,7 +3,7 @@ authors = ["Orestis Malaspinas, Michaël El Kharroubi"] ...@@ -3,7 +3,7 @@ authors = ["Orestis Malaspinas, Michaël El Kharroubi"]
language = "fr" language = "fr"
multilingual = false multilingual = false
src = "src" src = "src"
title = "Rust-101: Université d'été" title = "Rust-101: Université d'automne"
[output.html] [output.html]
mathjax-support = true mathjax-support = true
......
...@@ -258,4 +258,13 @@ on crée un tableau de `CustomInt` qui sont créés à partir de références ...@@ -258,4 +258,13 @@ on crée un tableau de `CustomInt` qui sont créés à partir de références
sur les tableau `v1`, `v2`, etc. qui vivrons ainsi jusqu'à la fin de notre sur les tableau `v1`, `v2`, etc. qui vivrons ainsi jusqu'à la fin de notre
programme et qui seront promenées sans qu'on ait besoin de les copier à aucun moment. programme et qui seront promenées sans qu'on ait besoin de les copier à aucun moment.
Les liens entre les durées de vie des références que nous nous sommes efforcés d'annoter dan tout au long ce code sont vérifiées par le compilateur qui Les liens entre les durées de vie des références que nous nous sommes efforcés d'annoter dan tout au long ce code sont vérifiées par le compilateur qui
vérifie qu'elles sont toutes valides à la compilation. vérifie qu'elles sont toutes valides à la compilation.
\ No newline at end of file
## Rustlings
```bash
$ rustlings run lifetimes1
$ rustlings run lifetimes2
$ rustlings run lifetimes3
```
...@@ -59,7 +59,7 @@ fn write_to_file(output: &str, numbers: &[i32]) -> Result<(), String> { ...@@ -59,7 +59,7 @@ fn write_to_file(output: &str, numbers: &[i32]) -> Result<(), String> {
/// these numbers. Returns errors when the parsing fails. /// these numbers. Returns errors when the parsing fails.
pub fn read_command_line_builder() -> Result<(), String> { pub fn read_command_line_builder() -> Result<(), String> {
// ANCHOR: matches // ANCHOR: matches
let matches = let matches =
// ANCHOR: new_command // ANCHOR: new_command
Command::new(COMMAND) Command::new(COMMAND)
.author(AUTHOR) .author(AUTHOR)
...@@ -97,29 +97,28 @@ pub fn read_command_line_builder() -> Result<(), String> { ...@@ -97,29 +97,28 @@ pub fn read_command_line_builder() -> Result<(), String> {
// ANCHOR_END: matches // ANCHOR_END: matches
// ANCHOR: numbers_matches // ANCHOR: numbers_matches
let numbers = let numbers = if let Some(count) =
if let Some(count) =
// ANCHOR: get_one_matches // ANCHOR: get_one_matches
matches.get_one::<usize>("count") matches.get_one::<usize>("count")
// ANCHOR_END: get_one_matches // ANCHOR_END: get_one_matches
{ {
read_from_urandom(*count)? read_from_urandom(*count)?
} else if let Some(numbers) = } else if let Some(numbers) =
// ANCHOR: get_many_matches // ANCHOR: get_many_matches
matches.get_many::<i32>("numbers") matches.get_many::<i32>("numbers")
// ANCHOR_END: get_many_matches // ANCHOR_END: get_many_matches
{ {
numbers.copied().collect() numbers.copied().collect()
} else { } else {
Vec::new() Vec::new()
}; };
// ANCHOR_END: numbers_matches // ANCHOR_END: numbers_matches
// ANCHOR: output_matches // ANCHOR: output_matches
if let Some(output) = if let Some(output) =
// ANCHOR: get_one_string_matches // ANCHOR: get_one_string_matches
matches.get_one::<String>("output") matches.get_one::<String>("output")
// ANCHOR_END: get_one_string_matches // ANCHOR_END: get_one_string_matches
{ {
write_to_file(output, &numbers)?; write_to_file(output, &numbers)?;
} else { } else {
......
...@@ -38,7 +38,7 @@ fn main() { ...@@ -38,7 +38,7 @@ fn main() {
safe_list.print(); safe_list.print();
unsafe_list.print(); unsafe_list.print();
for j in 1..1000 { for _j in 1..1000 {
let mut ul = UnsafeList::new(); let mut ul = UnsafeList::new();
for i in 1..1_000_000 { for i in 1..1_000_000 {
ul.push(i); ul.push(i);
......
[book]
authors = ["Orestis Malaspinas, Michaël El Kharroubi"]
language = "fr"
multilingual = false
src = "src"
title = "Rust-101: Université d'automne"
[output.html]
mathjax-support = true
[output.html.playground]
editable = true
[output.html.print]
enable = true
[output.pdf]
[output.linkcheck]
# Should we check links on the internet? Enabling this option adds a
# non-negligible performance impact
follow-web-links = false
# How should warnings be treated?
#
# - "warn" will emit warning messages
# - "error" treats all warnings as errors, failing the linkcheck
# - "ignore" will ignore warnings, suppressing diagnostic messages and allowing
# the linkcheck to continuing
warning-policy = "warn"
# Résumé des exercices
- [Exercices introductuifs](exercices_intro.md)
- [Exercices avancés](exercices_avances.md)
<!-- - [Les bases du Rust 1](./bases1.md) -->
<!-- - [Les bases du Rust 2](./bases2.md) -->
<!-- - [Les types avancés](./types_avances.md) -->
<!-- - [La généricité et des types composés](./gen_types_composes.md) -->
<!-- - [La propriété](./propriete.md) -->
<!-- - [Modules et visibilité](./modules_visibilite.md) -->
<!-- - [Les petits trucs sympas qui aident au développement](./tooling.md) -->
<!-- - [La gestion des erreurs en Rust](./gestion_erreurs.md) -->
<!-- - [Les closures](./closures.md) -->
<!-- - [Les itérateurs](./iterateurs.md) -->
<!-- - [Les collections](./collections.md) -->
<!-- - [Lifetimes](./lifetimes.md) -->
<!-- - [CLI](./cli.md) -->
<!-- - [Unsafe](./unsafe.md) -->
# Exercices # Exercices avancés
Les exercices que nous proposons ici sont très vagues. L'objectif est de vous donner des thèmes, Les exercices que nous proposons ici sont très vagues. L'objectif est de vous donner des thèmes,
de choses que vous connaissez du cours de programmation et d'algorithmique de l'année passée de choses que vous connaissez du cours de programmation et d'algorithmique de l'année passée
...@@ -27,4 +27,4 @@ au fur et à mesure de votre périple. ...@@ -27,4 +27,4 @@ au fur et à mesure de votre périple.
## Aller plus haut ## Aller plus haut
- Ascii art: écrire un convertisseur d'image en ASCII art. - Ascii art: écrire un convertisseur d'image en ASCII art.
- Simulation du système solaire: écrire un simulateur de système solaire. - Simulation du système solaire: écrire un simulateur de système solaire.
\ No newline at end of file
# Exercices introductifs
Le but de ces petits exercices est d'écrire des programmes simples avec une connaissance minimale du Rust.
Faites les dans l'ordre qui vous amuse. N'hésitez pas à refaire plusieurs fois le même exercice en variant
le type de structures de contrôle que vous utilisez par exemple.
## Année bissextile
Écrire un programme déterminant si une année est bissextile. Pour savoir si une année est bissextile, il faut que:
* l'année soit divisible par 4,
* sauf si elle est divisible par 100,
* sauf si elle est aussi divisible par 400!
Ainsi, l' année 2001 n'est pas bissextile. En revanche l'année 2000 l'est. Contrairement à l'année 1900 qui ne l'est pas.
## Nombre d'Armstrong
Un nombre Armstrong est un nombre qui est la somme de ses propres chiffres, chacun élevé à la puissance du nombre de chiffres.
Par exemple, un nombre d'Armstrong est un nombre qui est la somme de ses propres chiffres :
* \\(9\\) est un nombre d'Armstrong, car \\(9 = 9^1 = 9\\),
* \\(10\\) n'est pas un nombre Armstrong, car \\(10 \neq 1^2 + 0^2 = 1\\),
* \\(153\\) est un nombre Armstrong, car : \\(153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153\\),
* \\(154\\) n'est pas un nombre d'Armstrong, car : \\(154 \neq 1^3 + 5^3 + 4^3 = 1 + 125 + 64 = 190\\)
Écrivez un programme qui détermine si un nombre est un nombre d'Armstrong.
## Nombres heureux
Un nombre heureux est un entier naturel non nul, qui lorsqu'on calcule la somme des carrés de ses chiffres
puis la somme des carrés des chiffres du nombre obtenu et ainsi de suite, on aboutit au nombre 1.
Un nombre est malheureux lorsque ce n'est pas le cas.
Ainsi, le nombre 7 est heureux, car:
$$
7^2=49,
$$
$$
4^2+9^2=97,
$$
$$
9^2+7^2=130,
$$
$$
1^2+3^2+0^2=10,
$$
$$
1^2+0^2=1.
$$
D'autres nombres heureux sont 1, 10, 13, 19 par exemple. Il faut faire attention car certains nombres
rencontrés dans la suite mènent à une suite périodique: 4, 16, 20, 37, 42, 58, 89, 145 et on ne s'arrête jamais.
Écrivez un programme qui détermine si un nombre est heureux ou malheureux.
## Différence de nombres
Écrivez un programme qui calcule la différence entre le carré de la somme et la somme des carrés des $N$ premiers nombres naturels.
Le carré de la somme des dix premiers entiers naturels est
$$
(1 + 2 + ... + 10)^2 = 55^2 = 3025.
$$
La somme des carrés des dix premiers nombres naturels est
$$
1^2 + 2^2 + ... + 10^2 = 385.
$$
Donc, la différence entre le carré de la somme des dix premiers nombres naturels et la somme des carrés des dix premiers nombres naturels est
$$
3025 - 385 = 2640.
$$
## Nombre premier
Écrire un programme qui détermine si un nombre est premier. Un nombre est premier s'il n'a que deux diviseurs distincts.
## Décomposition en nombres premiers
Écrire un programme qui calcule les facteurs premiers d'un nombre naturel donné.
Exemple d'algorithme
Quels sont les facteurs premiers de 60 ?
* Notre premier diviseur est 2:
* 60 est divisible par 2 et il reste 30,
* 30 est divisible par 2 et il reste 15,
* 15 n'est pas divisible par 2,
* 15 est divisible par 3 et il reste 5,
* 5 n'est pas divisible par 2,
* 5 n'est pas divisible par 3,
* 5 n'est pas divisible par 4,
* 5 est divisible par 5 et il reste 1 et nous avons fini.
Nos diviseurs réussis dans ce calcul représentent la liste des facteurs premiers de 60 : 2, 2, 3 et 5.
Si cela vous amuse vous pouvez vérifier qu'ils sont bien premiers en utilisant l'exercice précédent.
...@@ -3,4 +3,4 @@ authors = ["Orestis"] ...@@ -3,4 +3,4 @@ authors = ["Orestis"]
language = "en" language = "en"
multilingual = false multilingual = false
src = "src" src = "src"
title = "Université d'été 2023: Rust 101" title = "Université d'automne 2024: Rust 101"
...@@ -2,25 +2,23 @@ ...@@ -2,25 +2,23 @@
- [Introduction](introduction.md) - [Introduction](introduction.md)
- [Installation](installation.md). - [Installation](installation.md).
- [Itérateurs](iterators.md).
- [Variables](variables.md). - [Variables](variables.md).
- [Types](types.md). - [Types](types.md).
- [Structures de contrôle](control.md). - [Structures de contrôle](control.md).
- [Types avancés](types_avances.md). - [Types avancés](types_avances.md).
- [Organisation du code](modules.md).
- [Fonctions](fonctions.md). - [Fonctions](fonctions.md).
- [Organisation du code](modules.md).
- [Ownership](ownership.md). - [Ownership](ownership.md).
- [Méthodes](methods.md).
- [Commentaires](commentaires.md). - [Commentaires](commentaires.md).
- [Gestion d'erreurs](errors.md). - [Gestion d'erreurs](errors.md).
- [Les closures](closures.md) - [Les closures](closures.md)
- [Méthodes](methods.md).
- [Pointeurs intelligents](smart_pointers.md). - [Pointeurs intelligents](smart_pointers.md).
- [Génériques](generics.md). - [Génériques](generics.md).
- [Traits](traits.md). - [Traits](traits.md).
- [Itérateurs](iterators.md).
- [Tests](tests.md). - [Tests](tests.md).
- [Vecteurs](vec.md). - [Vecteurs](vec.md).
- [Les Strings](string.md). - [Les Strings](string.md).
<!-- - [Itérateurs](iterators.md).
- [Unsafe Rust](collections.md). -->
- [Lifetimes](lifetimes.md). - [Lifetimes](lifetimes.md).
- [Unsafe](unsafe.md). - [Unsafe](unsafe.md).
...@@ -36,7 +36,7 @@ fn main() { ...@@ -36,7 +36,7 @@ fn main() {
## La boucle infinie: `loop` ## La boucle infinie: `loop`
```rust [] ignore ```rust ignore []
fn main() { fn main() {
loop { loop {
println!("En boucle!"); println!("En boucle!");
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
## `panic!()` ## `panic!()`
```rust [2-4|] should_panic ```rust should_panic [2-4|]
fn elem(v: &[i32], i: usize) -> i32 { fn elem(v: &[i32], i: usize) -> i32 {
if i >= v.len() { if i >= v.len() {
panic!("Erreur fatale!"); panic!("Erreur fatale!");
...@@ -67,7 +67,7 @@ stack backtrace: ...@@ -67,7 +67,7 @@ stack backtrace:
## Asserts ## Asserts
```rust [4,6,7|] should_panic ```rust should_panic [4,6,7|]
fn main() { fn main() {
let num = 1; let num = 1;
let denum = 0; let denum = 0;
...@@ -131,7 +131,7 @@ fn main() { ...@@ -131,7 +131,7 @@ fn main() {
## Options: `unwrap()` ## Options: `unwrap()`
```rust [11|] should_panic ```rust should_panic [11|]
fn div(num: i32, denum: i32) -> Option<i32> { fn div(num: i32, denum: i32) -> Option<i32> {
if denum == 0 { if denum == 0 {
None None
...@@ -179,7 +179,7 @@ fn main() { ...@@ -179,7 +179,7 @@ fn main() {
## `unwrap()` ## `unwrap()`
```rust [10|] should_panic ```rust should_panic [10|]
fn elem(v: &[i32], i: usize) -> Result<i32, &str> { fn elem(v: &[i32], i: usize) -> Result<i32, &str> {
if i >= v.len() { if i >= v.len() {
return Err("L'index est trop grand!") return Err("L'index est trop grand!")
...@@ -192,4 +192,4 @@ fn main() { ...@@ -192,4 +192,4 @@ fn main() {
let res = elem(&v, 100).unwrap(); let res = elem(&v, 100).unwrap();
println!("L'élément est {}", res); println!("L'élément est {}", res);
} }
``` ```
\ No newline at end of file
...@@ -27,7 +27,7 @@ fn main() { ...@@ -27,7 +27,7 @@ fn main() {
## Exemple avec générique (concept) ## Exemple avec générique (concept)
```rust [1|2|] compile_fail ```rust compile_fail [1|2|]
fn max<T>(a: T, b: T) -> T { fn max<T>(a: T, b: T) -> T {
if a > b { a } else { b } if a > b { a } else { b }
} }
...@@ -36,7 +36,7 @@ fn max<T>(a: T, b: T) -> T { ...@@ -36,7 +36,7 @@ fn max<T>(a: T, b: T) -> T {
## Vrai exemple avec générique ## Vrai exemple avec générique
```rust ```rust
// On doit dire au compilateur que T implémente "</>" // On doit dire au compilateur que T implémente "< , >"
fn max<T: PartialOrd>(a: T, b: T) -> T { fn max<T: PartialOrd>(a: T, b: T) -> T {
if a > b { a } else { b } if a > b { a } else { b }
} }
...@@ -54,7 +54,7 @@ fn main() { ...@@ -54,7 +54,7 @@ fn main() {
## Un seul type générique ## Un seul type générique
```rust [6-7|8|] compile_fail ```rust compile_fail [6-7|8|]
struct Point<T> { struct Point<T> {
x: T, x: T,
y: T, y: T,
......
...@@ -44,9 +44,9 @@ ...@@ -44,9 +44,9 @@
- Financé par Mozilla dès 2010. - Financé par Mozilla dès 2010.
- Rendu public la première fois en 2012 (version 0.4). - Rendu public la première fois en 2012 (version 0.4).
- Orientation vers la programmation système. - Orientation vers la programmation système.
- Première version stable (1.0) en 2015 (3 ans cette année). - Première version stable (1.0) en 2015 (9 ans cette année).
- Stabilisation de fonctionnalités tous les 6 semaines. - Stabilisation de fonctionnalités tous les 6 semaines.
- Version stable actuelle 1.71. <!-- TODO UPDATE --> - Version stable actuelle 1.81.0 <!-- TODO UPDATE -->
## Concept de base ## Concept de base
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
## Problématique ## Problématique
```rust [2|3-6|7|] compile_fail ```rust compile_fail [2|3-6|7|]
fn main() { fn main() {
let r; let r;
{ {
...@@ -20,7 +20,7 @@ fn main() { ...@@ -20,7 +20,7 @@ fn main() {
## Durée de vie: annotation ## Durée de vie: annotation
```rust [] compile_fail ```rust compile_fail []
fn main() { fn main() {
let r: &'a i32; // --------+-- 'a let r: &'a i32; // --------+-- 'a
{ // | { // |
...@@ -42,7 +42,7 @@ fn main() { ...@@ -42,7 +42,7 @@ fn main() {
## Exemple ## Exemple
```rust [8-13|1,7|] compile_fail ```rust compile_fail [8-13|1,7|]
fn longest(x: &str, y: &str) -> &str { fn longest(x: &str, y: &str) -> &str {
if x.len() > y.len() { if x.len() > y.len() {
x x
...@@ -82,7 +82,7 @@ fn main() { ...@@ -82,7 +82,7 @@ fn main() {
* Ne permet pas d'augmenter une durée de vie, * Ne permet pas d'augmenter une durée de vie,
* Le compilateur vérifie que la durée de vie est **compatible** avec la durée de vie. * Le compilateur vérifie que la durée de vie est **compatible** avec la durée de vie.
```rust [] ignore ```rust ignore []
&T // référence &T // référence
&'a T // référence avec durée de vie a &'a T // référence avec durée de vie a
&'a mut T // référence mutable avec durée de vie a &'a mut T // référence mutable avec durée de vie a
......
...@@ -45,7 +45,7 @@ fn main() { ...@@ -45,7 +45,7 @@ fn main() {
## Le mot-clé `self` ## Le mot-clé `self`
```rust [6-9|10-12|16-18|] compile_fail ```rust compile_fail [6-9|10-12|16-18|]
struct Rectangle { struct Rectangle {
width: u32, width: u32,
height: u32, height: u32,
...@@ -61,6 +61,7 @@ impl Rectangle { // les méthodes de Rectangle se trouvent dans un bloc impl ...@@ -61,6 +61,7 @@ impl Rectangle { // les méthodes de Rectangle se trouvent dans un bloc impl
} }
fn main() { fn main() {
let rect = Rectangle { width: 10, height: 5 }; let rect = Rectangle { width: 10, height: 5 };
// Problème ?
println!("La surface de ce rectangle println!("La surface de ce rectangle
est donnée par {} et son périmètre par {}.", est donnée par {} et son périmètre par {}.",
rect.area(), rect.perimeter()); rect.area(), rect.perimeter());
...@@ -108,7 +109,7 @@ impl Rectangle { // les méthodes de Rectangle se trouvent dans un bloc impl ...@@ -108,7 +109,7 @@ impl Rectangle { // les méthodes de Rectangle se trouvent dans un bloc impl
fn main() { fn main() {
let mut rect = Rectangle {width: 10, height: 5}; // rect doit être mutable let mut rect = Rectangle {width: 10, height: 5}; // rect doit être mutable
rect.set_width(1_000_000); // pour que cette ligne compile rect.set_width(1_000_000); // pour que cette ligne compile
println!("On a modifié width. L'instance de rectanle est {:?}.", rect); println!("On a modifié width. L'instance de rectangle est {:?}.", rect);
} }
``` ```
......
...@@ -55,7 +55,7 @@ fn main() { ...@@ -55,7 +55,7 @@ fn main() {
## Le contenu d'un module est privé ## Le contenu d'un module est privé
```rust [2-3,6|] compile_fail ```rust compile_fail [2-3,6|]
mod hepia { mod hepia {
fn uni_automne() { fn uni_automne() {
} }
...@@ -114,7 +114,7 @@ ecole ...@@ -114,7 +114,7 @@ ecole
## Les fichiers et visibilité ## Les fichiers et visibilité
```rust [1-3|4-6|7-8|9-10|11-12|13-17|] ignore ```rust ignore [1-3|4-6|7-8|9-10|11-12|13-17|]
// dans lib.rs // dans lib.rs
pub mod hepia; pub mod hepia;
pub mod heg; pub mod heg;
...@@ -153,4 +153,4 @@ pub ...@@ -153,4 +153,4 @@ pub
| pub ( self ) // public dans le module courant | pub ( self ) // public dans le module courant
| pub ( super ) // public dans le module parent | pub ( super ) // public dans le module parent
| pub ( in path ) // public dans le path explicite | pub ( in path ) // public dans le path explicite
``` ```
\ No newline at end of file
...@@ -117,7 +117,7 @@ fn main() { ...@@ -117,7 +117,7 @@ fn main() {
## Changement de propriétaire: invalide ## Changement de propriétaire: invalide
```rust [7-8|9|] compile_fail ```rust compile_fail [7-8|9|]
fn main() { fn main() {
let mut y = Vec::new(); let mut y = Vec::new();
for i in 0..5 { for i in 0..5 {
...@@ -167,7 +167,7 @@ fn main() { ...@@ -167,7 +167,7 @@ fn main() {
## Lors du passage en paramètre à une fonction ## Lors du passage en paramètre à une fonction
```rust [1-3,8|] compile_fail ```rust compile_fail [1-3,8|]
fn take_own(_v: Vec<i32>) { fn take_own(_v: Vec<i32>) {
// on fait des choses // on fait des choses
} }
...@@ -242,7 +242,7 @@ fn main() { ...@@ -242,7 +242,7 @@ fn main() {
## Exemple 2 ## Exemple 2
```rust [1-4,10|] compile_fail ```rust compile_fail [1-4,10|]
fn get_len(v: &Vec<i32>) -> usize { fn get_len(v: &Vec<i32>) -> usize {
v.push(2); // on ajoute 2 à v v.push(2); // on ajoute 2 à v
v.len() v.len()
...@@ -281,7 +281,7 @@ fn main() { ...@@ -281,7 +281,7 @@ fn main() {
## Sans la règle sur la référence mutable ## Sans la règle sur la référence mutable
```rust [2|3|4|5-6|] compile_fail ```rust compile_fail [2|3|4|5-6|]
fn main() { fn main() {
let mut y = Vec::new(); let mut y = Vec::new();
let z = &y; let z = &y;
...@@ -326,7 +326,7 @@ fn main() { ...@@ -326,7 +326,7 @@ fn main() {
fn main() { fn main() {
let mut y = Vec::new(); let mut y = Vec::new();
y.push(1); y.push(2); y.push(3); y.push(4); y.push(1); y.push(2); y.push(3); y.push(4);
{ { // optionnel, le compilo est smart
let mut y1 = &mut y; let mut y1 = &mut y;
y1.push(7); y1.push(7);
} }
......
...@@ -68,7 +68,7 @@ fn main() { ...@@ -68,7 +68,7 @@ fn main() {
## Cas pratique: la liste chaînée ## Cas pratique: la liste chaînée
```rust [1,4|2-3|1-4|] compile_fail ```rust compile_fail [1,4|2-3|1-4|]
enum List { enum List {
Elem(i32, List), Elem(i32, List),
Nil, Nil,
......