Skip to content
Snippets Groups Projects
Commit 007df026 authored by orestis.malaspin's avatar orestis.malaspin
Browse files

Merge branch 'unsafe' into 'main'

Unsafe chapter was added

Closes #29

See merge request orestis.malaspin/rust-101!37
parents fe15003f d23c9402
No related branches found
No related tags found
No related merge requests found
Showing
with 9399 additions and 0 deletions
# Commentaires
## Commentaires simples
```rust [2-3|4-7|]
fn main() {
// Tout programme Rust a un point d'entrée qui est
// une fonction fn main().
/*
On peut également documenter sur plusieurs lignes.
Cela se fait comme ceci.
*/
println!("Hello, World!"); // Ceci est un macro en ligne.
}
```
## Commentaires de documentation
- La commande `cargo doc --open` génère la documentation en HTML.
```rust [1-2|4|6-9|]
/// Cette fonction ajoute deux, puis multiplie par trois.
/// Cette documentation supporte le Markdown.
///
/// # Exemple
///
/// ```
/// let five = 5;
/// add_two_mul_three(five);
/// ```
pub fn add_two_mul_three(x: i32) -> i32 {
(x + 2) * 3
}
```
## Tests de documentation
```rust [6-10|]
/// Cette fonction ajoute deux, puis multiplie par trois.
/// Elle doit se trouver dans la librairie (pas dans le `main.rs`).
///
/// # Exemple
///
/// ```
/// use tests::add_two_mul_three;
/// let five = 5;
/// add_two_mul_three(five);
/// ```
pub fn add_two_mul_three(x: i32) -> i32 {
(x + 2) * 3
}
```
## Tests de documentation: compte rendu
```sh
$ cargo test --doc
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Doc-tests hello_world
running 1 test
test src/lib.rs - add_two_mul_three (line 11) ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
```
## Commentaires de module
- La documentation du projet en entier se fait avec `//!` en début de ligne.
```rust [1-5|]
//! # Hello world
//!
//! `hello_world` est l'exemple typique de tout
//! cours de programmation. Ces commentaires vont en entête
//! d'un fichier de module.
/// Cette fonction ajoute deux, puis multiplie par trois.
pub fn add_two_mul_three(x: i32) -> i32 {
(x + 2) * 3
}
```
# Gestion d'erreurs
## Les différents types d'erreur
- Il est important de pouvoir gérer trois cas:
- La panique totale (erreur fatale du programme).
- L'erreur dont on peut se remettre.
- Un résultat qui peut contenir une valeur ou pas.
## `panic!()`
```rust [2-4|] should_panic
fn elem(v: &[i32], i: usize) -> i32 {
if i >= v.len() {
panic!("Erreur fatale!");
}
v[i]
}
fn main() {
let v = [1, 2, 3, 4];
elem(&v, 100);
}
```
## Debugging
```sh
$ RUST_BACKTRACE=1 cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/ma_librairie`
thread 'main' panicked at 'Erreur fatale!', src/main.rs:5:3
stack backtrace:
0: std::sys::unix::backtrace::tracing::imp::unwind_backtrace
at libstd/sys/unix/backtrace/tracing/gcc_s.rs:49
1: std::sys_common::backtrace::print
at libstd/sys_common/backtrace.rs:71
at libstd/sys_common/backtrace.rs:59
2: std::panicking::default_hook::{{closure}}
at libstd/panicking.rs:211
3: std::panicking::default_hook
at libstd/panicking.rs:227
4: std::panicking::rust_panic_with_hook
at libstd/panicking.rs:477
5: std::panicking::begin_panic
at /checkout/src/libstd/panicking.rs:411
6: ma_librairie::elem
at src/main.rs:5
7: ma_librairie::main
at src/main.rs:12
8: std::rt::lang_start::{{closure}}
at /checkout/src/libstd/rt.rs:74
9: std::panicking::try::do_call
at libstd/rt.rs:59
at libstd/panicking.rs:310
10: __rust_maybe_catch_panic
at libpanic_unwind/lib.rs:102
11: std::rt::lang_start_internal
at libstd/panicking.rs:289
at libstd/panic.rs:392
at libstd/rt.rs:58
12: std::rt::lang_start
at /checkout/src/libstd/rt.rs:74
13: main
14: __libc_start_main
15: _start
```
## Asserts
```rust [4,6,7|] should_panic
fn main() {
let num = 1;
let denum = 0;
assert!(denum != 0, "Le dénominateur doit être non nul.");
let _total = num / denum;
assert_eq!(num, denum, "num et denum devraient être égales.");
assert_ne!(a, b, "num et denum devraient être différentes.");
}
```
## Options
```rust
enum Option<T> { // <T> est une notation pour un type générique
Some(T),
None,
}
```
- Type énuméré générique, `Some` encapsule un `T`, `None` un "rien".
## Options: exemple
```rust [4-9|10-13|]
fn main() {
let num = 1;
let denum = 4;
let div =
if denum == 0 {
None
} else {
Some(num / denum)
};
match div {
Some(d) => println!("{} divisé par {} donne {}", num, denum, d),
None => println!("Cette division n'existe pas."),
}
}
```
## Options: `if let`
```rust [1-7|11-15|]
fn div(num: i32, denum: i32) -> Option<i32> {
if denum == 0 {
None
} else {
Some(num / denum)
}
}
fn main() {
let num = 1;
let denum = 4;
if let res = Some(div(num, denum)) {
println!("{num} / {denum} = res");
} else {
println!("Une division par zéro est impossible.");
}
}
```
## Options: `unwrap()`
```rust [11|] should_panic
fn div(num: i32, denum: i32) -> Option<i32> {
if denum == 0 {
None
} else {
Some(num / denum)
}
}
fn main() {
let num = 1;
let denum = 0;
let res = div(num, denum).unwrap(); // panique!
println!("{num} / {denum} = res");
}
```
## Results
```rust
enum Result<T, E> {
Ok(T),
Err(E),
}
```
- Deux types génériques `T` (réussite) et `E` (erreur).
## Exemple
```rust [1-7|10-13|]
fn elem(v: &[i32], i: usize) -> Result<i32, &str> {
if i >= v.len() {
Err("L'index est trop grand!")
} else {
Ok(v[i])
}
}
fn main() {
let v = [1, 2, 3, 4];
match elem(&v, 100) {
Ok(i) => println!("L'élément est {}", i),
Err(e) => println!("Mince ça a raté car: {}.", e),
}
}
```
## `unwrap()`
```rust [10|] should_panic
fn elem(v: &[i32], i: usize) -> Result<i32, &str> {
if i >= v.len() {
return Err("L'index est trop grand!")
} else {
Ok(v[i])
}
}
fn main() {
let v = [1, 2, 3, 4];
let res = elem(&v, 100).unwrap();
println!("L'élément est {}", res);
}
```
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 1200 800" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g id="Layer-1" serif:id="Layer 1">
<g transform="matrix(1,0,0,1,597.344,637.02)">
<path d="M0,-279.559C-121.238,-279.559 -231.39,-264.983 -312.939,-241.23L-312.939,-38.329C-231.39,-14.575 -121.238,0 0,0C138.76,0 262.987,-19.092 346.431,-49.186L346.431,-230.37C262.987,-260.465 138.76,-279.559 0,-279.559" style="fill:rgb(165,43,0);fill-rule:nonzero;"/>
</g>
<g transform="matrix(1,0,0,1,1068.75,575.642)">
<path d="M0,-53.32L-14.211,-82.761C-14.138,-83.879 -14.08,-84.998 -14.08,-86.121C-14.08,-119.496 -48.786,-150.256 -107.177,-174.883L-107.177,2.643C-79.932,-8.849 -57.829,-21.674 -42.021,-35.482C-46.673,-16.775 -62.585,21.071 -75.271,47.686C-96.121,85.752 -103.671,118.889 -102.703,120.53C-102.086,121.563 -94.973,110.59 -84.484,92.809C-60.074,58.028 -13.82,-8.373 -4.575,-25.287C5.897,-44.461 0,-53.32 0,-53.32" style="fill:rgb(165,43,0);fill-rule:nonzero;"/>
</g>
<g transform="matrix(1,0,0,1,149.064,591.421)">
<path d="M0,-99.954C0,-93.526 1.293,-87.194 3.788,-80.985L-4.723,-65.835C-4.723,-65.835 -11.541,-56.989 0.465,-38.327C11.055,-21.872 64.1,42.54 92.097,76.271C104.123,93.564 112.276,104.216 112.99,103.187C114.114,101.554 105.514,69.087 81.631,32.046C70.487,12.151 57.177,-14.206 49.189,-33.675C71.492,-19.559 100.672,-6.755 135.341,4.265L135.341,-204.17C51.797,-177.622 0,-140.737 0,-99.954" style="fill:rgb(165,43,0);fill-rule:nonzero;"/>
</g>
<g transform="matrix(-65.8097,-752.207,-752.207,65.8097,621.707,796.312)">
<path d="M0.991,-0.034L0.933,0.008C0.933,0.014 0.933,0.02 0.933,0.026L0.99,0.069C0.996,0.073 0.999,0.08 0.998,0.087C0.997,0.094 0.992,0.1 0.986,0.103L0.92,0.133C0.919,0.139 0.918,0.145 0.916,0.15L0.964,0.203C0.968,0.208 0.97,0.216 0.968,0.222C0.965,0.229 0.96,0.234 0.953,0.236L0.882,0.254C0.88,0.259 0.877,0.264 0.875,0.27L0.91,0.33C0.914,0.336 0.914,0.344 0.91,0.35C0.907,0.356 0.9,0.36 0.893,0.361L0.82,0.365C0.817,0.369 0.813,0.374 0.81,0.379L0.832,0.445C0.835,0.452 0.833,0.459 0.828,0.465C0.824,0.47 0.816,0.473 0.809,0.472L0.737,0.462C0.733,0.466 0.729,0.47 0.724,0.474L0.733,0.544C0.734,0.551 0.731,0.558 0.725,0.562C0.719,0.566 0.711,0.568 0.704,0.565L0.636,0.542C0.631,0.546 0.626,0.549 0.621,0.552L0.615,0.621C0.615,0.629 0.61,0.635 0.604,0.638C0.597,0.641 0.589,0.641 0.583,0.638L0.521,0.602C0.52,0.603 0.519,0.603 0.518,0.603L0.406,0.729C0.406,0.729 0.394,0.747 0.359,0.725C0.329,0.705 0.206,0.599 0.141,0.543C0.109,0.52 0.089,0.504 0.09,0.502C0.093,0.499 0.149,0.509 0.217,0.554C0.278,0.588 0.371,0.631 0.38,0.619C0.38,0.619 0.396,0.604 0.406,0.575C0.406,0.575 0.406,0.575 0.406,0.575C0.407,0.576 0.407,0.576 0.406,0.575C0.406,0.575 0.091,0.024 0.305,-0.531C0.311,-0.593 0.275,-0.627 0.275,-0.627C0.266,-0.639 0.178,-0.598 0.12,-0.566C0.055,-0.523 0.002,-0.513 0,-0.516C-0.001,-0.518 0.018,-0.533 0.049,-0.555C0.11,-0.608 0.227,-0.707 0.256,-0.726C0.289,-0.748 0.301,-0.73 0.301,-0.73L0.402,-0.615C0.406,-0.614 0.41,-0.613 0.415,-0.613L0.47,-0.658C0.475,-0.663 0.483,-0.664 0.49,-0.662C0.497,-0.66 0.502,-0.655 0.504,-0.648L0.522,-0.58C0.527,-0.578 0.533,-0.576 0.538,-0.574L0.602,-0.608C0.608,-0.612 0.616,-0.612 0.623,-0.608C0.629,-0.605 0.633,-0.599 0.633,-0.592L0.637,-0.522C0.642,-0.519 0.647,-0.515 0.652,-0.512L0.721,-0.534C0.728,-0.536 0.736,-0.535 0.741,-0.531C0.747,-0.526 0.75,-0.519 0.749,-0.512L0.738,-0.443C0.742,-0.439 0.746,-0.435 0.751,-0.431L0.823,-0.439C0.83,-0.44 0.837,-0.437 0.842,-0.432C0.847,-0.426 0.848,-0.419 0.845,-0.412L0.821,-0.347C0.824,-0.342 0.828,-0.337 0.831,-0.332L0.903,-0.327C0.911,-0.327 0.917,-0.322 0.92,-0.316C0.924,-0.31 0.924,-0.302 0.92,-0.296L0.883,-0.236C0.885,-0.231 0.887,-0.226 0.889,-0.22L0.959,-0.202C0.966,-0.2 0.972,-0.195 0.974,-0.188C0.976,-0.181 0.974,-0.174 0.969,-0.168L0.92,-0.116C0.921,-0.111 0.923,-0.105 0.924,-0.099L0.988,-0.068C0.995,-0.065 0.999,-0.059 1,-0.052C1.001,-0.045 0.997,-0.038 0.991,-0.034ZM0.406,0.575C0.406,0.575 0.406,0.575 0.406,0.575C0.406,0.575 0.406,0.575 0.406,0.575Z" style="fill:url(#_Linear1);fill-rule:nonzero;"/>
</g>
<g transform="matrix(1,0,0,1,450.328,483.629)">
<path d="M0,167.33C-1.664,165.91 -2.536,165.068 -2.536,165.068L140.006,153.391C23.733,0 -69.418,122.193 -79.333,135.855L-79.333,167.33L0,167.33Z" style="fill-rule:nonzero;"/>
</g>
<g transform="matrix(1,0,0,1,747.12,477.333)">
<path d="M0,171.974C1.663,170.554 2.536,169.71 2.536,169.71L-134.448,159.687C-18.12,0 69.421,126.835 79.335,140.497L79.335,171.974L0,171.974Z" style="fill-rule:nonzero;"/>
</g>
<g transform="matrix(-1.53e-05,-267.211,-267.211,1.53e-05,809.465,764.23)">
<path d="M1,-0.586C1,-0.586 0.768,-0.528 0.524,-0.165L0.5,-0.064C0.5,-0.064 1.1,0.265 0.424,0.731C0.424,0.731 0.508,0.586 0.405,0.197C0.405,0.197 0.131,0.376 0.14,0.736C0.14,0.736 -0.275,0.391 0.324,-0.135C0.324,-0.135 0.539,-0.691 1,-0.736L1,-0.586Z" style="fill:url(#_Linear2);fill-rule:nonzero;"/>
</g>
<g transform="matrix(1,0,0,1,677.392,509.61)">
<path d="M0,-92.063C0,-92.063 43.486,-139.678 86.974,-92.063C86.974,-92.063 121.144,-28.571 86.974,3.171C86.974,3.171 31.062,47.615 0,3.171C0,3.171 -37.275,-31.75 0,-92.063" style="fill-rule:nonzero;"/>
</g>
<g transform="matrix(1,0,0,1,727.738,435.209)">
<path d="M0,0.002C0,18.543 -10.93,33.574 -24.408,33.574C-37.885,33.574 -48.814,18.543 -48.814,0.002C-48.814,-18.539 -37.885,-33.572 -24.408,-33.572C-10.93,-33.572 0,-18.539 0,0.002" style="fill:white;fill-rule:nonzero;"/>
</g>
<g transform="matrix(1,0,0,1,483.3,502.984)">
<path d="M0,-98.439C0,-98.439 74.596,-131.467 94.956,-57.748C94.956,-57.748 116.283,28.178 33.697,33.028C33.697,33.028 -71.613,12.745 0,-98.439" style="fill-rule:nonzero;"/>
</g>
<g transform="matrix(1,0,0,1,520.766,436.428)">
<path d="M0,0C0,19.119 -11.27,34.627 -25.173,34.627C-39.071,34.627 -50.344,19.119 -50.344,0C-50.344,-19.124 -39.071,-34.627 -25.173,-34.627C-11.27,-34.627 0,-19.124 0,0" style="fill:white;fill-rule:nonzero;"/>
</g>
<g transform="matrix(-1.53e-05,-239.021,-239.021,1.53e-05,402.161,775.388)">
<path d="M0.367,0.129C-0.364,-0.441 0.223,-0.711 0.223,-0.711C0.259,-0.391 0.472,-0.164 0.472,-0.164C0.521,-0.548 0.525,-0.77 0.525,-0.77C1.203,-0.256 0.589,0.161 0.589,0.161C0.627,0.265 0.772,0.372 0.906,0.451L1,0.77C0.376,0.403 0.367,0.129 0.367,0.129Z" style="fill:url(#_Linear3);fill-rule:nonzero;"/>
</g>
</g>
<defs>
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,1.38778e-17,-1,0,-0.000650515)"><stop offset="0" style="stop-color:rgb(247,76,0);stop-opacity:1"/><stop offset="0.33" style="stop-color:rgb(247,76,0);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(244,150,0);stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear2" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,-1,0,1.23438e-06)"><stop offset="0" style="stop-color:rgb(204,58,0);stop-opacity:1"/><stop offset="0.15" style="stop-color:rgb(204,58,0);stop-opacity:1"/><stop offset="0.74" style="stop-color:rgb(247,76,0);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(247,76,0);stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear3" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,1.32349e-23,1.32349e-23,-1,0,-9.1568e-07)"><stop offset="0" style="stop-color:rgb(204,58,0);stop-opacity:1"/><stop offset="0.15" style="stop-color:rgb(204,58,0);stop-opacity:1"/><stop offset="0.74" style="stop-color:rgb(247,76,0);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(247,76,0);stop-opacity:1"/></linearGradient>
</defs>
</svg>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
# Instructions et expressions
## Les instructions (statements)
- **Instruction**: commande effectuant une action mais ne retournant aucune valeur.
```rust ignore
let x = 1; // une instruction
```
<br>
- On ne peut pas assigner une instruction `let`
```rust compile_fail
let y = (let x = 1);
```
## Les expressions
- **Expression**: combinaison de variables, opérations, ... retournant une valeur.
```c
3 + 5
```
- Presque tout code Rust est une expression.
```rust [|2-5|4|]
fn main() {
let y = {
let x = 5 + 3;
x - 9
};
println!("5 + 3 - 9 = {}", y);
}
```
# Fonctions
## Fonction sans argument, sans retour
```rust [1-4|5-7]
fn main() {
println!("La fonction main est une fonction.");
fonction_fonction();
}
fn fonction_fonction() {
println!("La fonction fonction_fonction est une fonction.");
}
```
## Fonction avec argument, sans retour
```rust [1-3|5|]
fn affiche_entier(x: i32) {
println!("Affiche l'entier {}.", x);
}
fn main() {
affiche_entier(1024);
}
```
## Valeur de retour de fonctions
```rust [1-3|2|]
fn la_reponse() -> i32 {
42 // ou return 42;
}
fn main() {
println!("La réponse est {}.", la_reponse());
}
```
## Une erreur est vite faite
```rust compile_fail
fn la_reponse() -> i32 {
42;
}
```
## On peut faire plus
```rust [2-6|]
fn la_reponse(univers_et_tout: bool) -> i32 {
if univers_et_tout {
42
} else {
-1
}
}
fn main() {
println!("La réponse_est {}.", la_reponse(true));
}
```
## L'erreur
```console
error[E0308]: mismatched types
--> src/main.rs:1:20
|
1 | fn la_reponse() -> i32 {
| ---------- ^^^ expected `i32`, found `()`
| |
| implicitly returns `()` as its body has no tail or `return` expression
2 | 42;
| - help: remove this semicolon to return this value
For more information about this error, try `rustc --explain E0308`
```
Une fonction sans retour retourne un `()`.
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment