diff --git a/essential_rust.tex b/essential_rust.tex index 445108cecafad1778229329e42e9ad029082f9a8..b96aed3dfa13c9eff653f525b907a4366469c7e4 100644 --- a/essential_rust.tex +++ b/essential_rust.tex @@ -353,40 +353,39 @@ fn main() { } \end{lstlisting} - // Il est possible de déstructurer le tuple... - let (a, b, c) = t; +\section{Tableaux} - // ... ou bien de récupérer des éléments grâce à des index. - let s = t.1; +Comme pour les chaînes de caractères, les tableaux se présentent sous plusieurs formes. - println!("{} {} {} {}", a, b, c, s); // "1 Hello 3.4 Hello" -} -\end{lstlisting} +Tous peuvent être modifié avec \texttt{tab[i] = v;} (à condition bien sûr qu'ils +soient déclarés \texttt{mut}). -\vspace{.5cm} +\begin{itemize} + \item \texttt{Vec<Type>} : un tableau dynamique qui contient des éléments de type \texttt{T}.\\ + Peut être redimensionné avec \texttt{push}.\\ + Equivalent de \texttt{String} : un \texttt{String} est presque un + \texttt{Vec<char>} avec quelques méthodes en plus.\\~\\ + D'ailleurs pour convertir de l'un à l'autre on dispose de\\ + \texttt{let chaine: String = vecteur.iter().collect();}\\ + \texttt{let vecteur: Vec<char> = chaine.chars().collect();} + \item \texttt{[Type; Taille]} (e.g. \texttt{[u64; 5]}) : un tableau de taille fixée connue. + \item \texttt{\&[Type]} : un tableau de taille fixée inconnue.\\ + Équivalent de \texttt{\&str}. +\end{itemize} -Toute variable qui n'a pas de taille connue (vecteurs, chaîne de caractères...) sera stockée dans le tas. +Ici encore on peut dans une certaine mesure convertir d'un type à un autre. \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]" + let vector: Vec<usize> = vec![1, 2, 3]; + let array: [usize; 3] = [1, 2, 3]; - // Vecteur de \textbf{i32}. - // \textbf{vec!} permet d'initialiser des valeurs. - let mut vector: Vec<i32> = vec![1, 2, 3, 4]; + let slice_of_full_vector: &[usize] = &vector; + let slice_of_partial_vector: &[usize] = &vector[..2]; + let slice_of_full_array: &[usize] = &array; - // 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]" + let vector_of_array = array.to_vec(); + let vector_of_slice = &array[1..].to_vec(); } \end{lstlisting}