diff --git a/essential_rust.tex b/essential_rust.tex index 1987c6f0a7abdbf71b96f20d18cc77402b152f70..c65c3744e946de2dd5889b97967e14c91a6e1bb3 100644 --- a/essential_rust.tex +++ b/essential_rust.tex @@ -1109,7 +1109,7 @@ fn main() { let handle = thread::spawn(move || { println!("{:?}", vector); // "[1, 2, 3]" }); - + // \textbf{vector} est inutilisable, vu que cette scope n'a plus l'appartenance de cette variable. handle.join().unwrap(); @@ -1323,4 +1323,83 @@ struct User { } \end{lstlisting} +\section{Notions avancées} + +\subsection{Tout est une expression} +\label{expressionsEverywhere} + +\subsection{Déstructuration} +\label{advancedDestructuring} + +\subsection{Chaînes de caractères} +\label{advancedStrings} + +\subsection{Macros} +\label{advancedMacros} + +\subsection{Lifetimes} +\label{advancedLifetimes} + +\subsection{Conteneurs} + +Les conteneurs sont des structures permettant de stocker des données. + +Toute variable qui a une taille connue (types primitifs, tableaux de taille fixe, ...) +sera stockée dans la pile. + +\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); + + // Il est possible de déstructurer le tuple... + let (a, b, c) = t; + + // ... ou bien de récupérer des éléments grâce à des index. + let s = t.1; + + println!("{} {} {} {}", a, b, c, s); // "1 Hello 3.4 Hello" +} +\end{lstlisting} + +\vspace{.5cm} + +Toute variable qui n'a pas de taille connue (vecteurs, chaîne de caractères...) sera stockée dans le tas. + +\begin{lstlisting}[style=Rust, language=Rust] +fn main() { + // Tableau de 5 éléments de \textbf{i32}. + let array: [i32; 5] = [1, 2, 3, 4, 5]; + + // Pour les tableaux, il n'existe pas une façon unique de les représenter. + // Ainsi, on utilise \textbf{{:?}} permettant d'afficher dans un format de débug. + println!("{:?}", array); // "[1, 2, 3, 4, 5]" + + // Vecteur de \textbf{i32}. + // \textbf{vec!} permet d'initialiser des valeurs. + let mut vector: Vec<i32> = vec![1, 2, 3, 4]; + + // Ajout de la valeur \textbf{5} à la fin du vecteur. + vector.push(5); + + // Slice d'un vecteur, cela fonctionne comme un slice d'une chaîne de caractères. + let slice: &[i32] = &vector; + + println!("{:?} {:?}", vector, slice); // "[1, 2, 3, 4, 5] [1, 2, 3, 4, 5]" +} +\end{lstlisting} + +\vspace{.5cm} + +Pour forcer le passage vers le tas, la structure de donnée \texttt{Box} doit être utilisée. + +\begin{lstlisting}[style=Rust, language=Rust] +fn main() { + // Box de \textbf{i32} + let a: Box<i32> = Box::new(5); + + println!("a = {}", a); // "a = 5" +} +\end{lstlisting} + \end{document}