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;