diff --git a/essential_rust.tex b/essential_rust.tex
index 428eb8820699d764d224c9f681142c0edd5bd6d6..445108cecafad1778229329e42e9ad029082f9a8 100644
--- a/essential_rust.tex
+++ b/essential_rust.tex
@@ -276,18 +276,82 @@ fn main() {
 }
 \end{lstlisting}
 
+Il y a des choses qu'on peut ou ne peut pas faire avec ces deux formats :
+\begin{itemize}
+    \item on ne peut pas modifier une \texttt{\&str}, alors que \texttt{String}
+        a des méthodes pour être modifiée
+    \item on ne peut pas additionner (concaténer) deux \texttt{String} alors qu'on peut
+        additionner \texttt{\&str + \&str} ou encore \texttt{String + \&str}
+\end{itemize}
+Pour beaucoup de raisons il y a dans la librairie standard des fonctions qui demandent
+l'un ou l'autre type. Heureusement la conversion est facile.
+
+
+On verra souvent des erreurs de compilation comme celle-ci :
+\begin{lstlisting}[style=Rust]
+   Compiling playground v0.0.1 (/playground)
+error[E0308]: mismatched types
+ --> src/main.rs:4:14
+  |
+4 |     hello += world;
+  |              ^^^^^
+  |              |
+  |              expected `&str`, found struct `String`
+  |              help: consider borrowing here: `&world`
+
+For more information about this error, try `rustc --explain E0308`.
+error: could not compile `playground` due to previous error
+\end{lstlisting}
+Il suffit de remplacer la ligne en \texttt{hello += \&world;} pour que cela fonctionne.
+\newpage
+
+\begin{lstlisting}[style=Rust, language=Rust]
+fn main() {
+    let mut hello = String::new();  // nouvelle String vide
+
+    hello.push_str("Hello ");  // concatène du texte à hello
+    hello += "World";  // += est équivalent à push\_str
+    hello.push('!');  // concatène un unique caractère
+                      // ('' est la notation pour le type \texttt{char})
 
+    println!("{}", hello);  // "Hello World!"
+}
+\end{lstlisting}
 
-\section{Conteneurs en Rust}
+\subsection{Formattage}
 
-Les conteneurs sont des structures de données permettant de stocker des données.
+La manière standard de formatter du texte est la famille de macros \texttt{format!}.
 
-Toute variable qui a une taille connue (types primitifs, structure de données, tableaux, ...) sera stockée dans la pile.
+(pour plus de détails sur les macros en général, voir \Cref{advancedMacros})
 
 \begin{lstlisting}[style=Rust, language=Rust]
 fn main() {
-    // Tuple contenant des données de différents types.
-    let t: (i32, &str, f64) = (1, "Hello", 3.4);
+    print!("{} {} {} ", 1, '2', "trois");  // affiche "1 2 trois" sans retour à la ligne
+    println("quatre {} {}", 5, 6.0);  // affiche "quatre 5 6" avec un retour à la ligne
+
+    eprint!("erreur ");
+    eprintln!("grave");  // pareil mais sur la sortie stderr
+
+    let formatteur: std::fmt::Formatter = ...;  // comment obtenir un formatteur est au delà 
+                                                // des objectifs de cette section, on montre
+                                                // juste qu'il s'utilise de manière similaire
+    write!(formatteur, "truc");
+    writeln!(formatteur, "bidule");
+
+    let s: String = format!("{} + {} = {}", 1, 2, 3);
+    // s vaut "1 + 2 = 3"
+
+    // À chaque fois on peut préciser le format d'affichage dans les \{\}
+    let hello = "hello";
+    println!("{hello}");  // équivalent de println!("{}", hello)
+    println!("{hello:#?}");  // affichage de debug, écrit "hello" en incluant les guillemets
+    println!("{hello: >10}");  // aligne à une largeur de 10 en rajoutant des espaces
+    // et beaucoup d'autres, parmi lesquels :
+    // - comment afficher le signe + ou -
+    // - comment représenter les flottants
+    // - etc...
+}
+\end{lstlisting}
 
     // Il est possible de déstructurer le tuple...
     let (a, b, c) = t;