# Strings et affichage formatté

On a vu dans le chapitre sur les [types primitifs](primitif.md) que l'on peut faire des chaines de caractères avec `&str`, mais ici on va voir la version plus évoluée avec `String`

Ce type plus complexe a beaucoup de méthodes et de possibilités. D'abord voyons comment le créer :

```rust
// On peut créer un nouveau String vide comme ceci:
let mon_string = String::new();

// On peut aussi créer un String à partir d'un litéral (exemple "hello")
let mon_autre_string = String::from("Hello World");

// Sinon on peut aussi convertir un &str en String avec la méthode de &str 'to_string'
let troisieme_string = "Foo Bar".to_string();

// Affichons tout ça
println!("{} {} {}", mon_string, mon_autre_string, troisieme_string);
```


Contrairement aux &str, on peut aussi concaténer des String avec des &str

```rust
let un = String::from("hello ");
let deux = "world";
let trois = un + deux;
println!("{}", trois);
```

Je ne vais pas passer en revue toutes les méthodes de String, car après avoir compris les types `Option` que l'on va voir dans [un futur chapitre](enum.md) et celui sur les [fonctions](fn.md), vous serez en mesure de comprendre toutes les méthodes à partir de la documentation.

Parmis d'autres, voici quelques exemples de choses qui peuvent être faites avec String: remplacer des chaines de caractères, remplacer le début ou la fin de chaine de caractère (attention peut nécessiter d'utiliser la méthode `trim()` avant), etc.

Toutes la documentation est disponible **[ici](https://doc.rust-lang.org/stable/std/string/struct.String.html)**.

## Affichage formatté
Maintenant pour afficher des choses dans le terminal ou formater des choses d'une certaine manière. On peut utiliser des _macros_.

La premiere que j'ai déjà utilisé avant est `println!()`, l'autre pour formatter est `format!()` et enfin une troisième pour print sans retour à la ligne est `print!()`

```rust
// On peut print à partir d'un litéral
println!("Hello World");

// Mais on peut aussi print avec une sorte de template
let nombre = 42;
let chaine = "La réponse de la vie est ";

// Pour que l'un type puisse être affiché comme ceci il faut qu'il implémente le type `Display`
// Ne faites pas attention au & maintenant, on va y venir plus tard
println!("{} {}", &chaine, nombre);

let result = format!("Même chose mais avec format d'abord → {} {}", chaine, nombre );
println!("{}", result);

// En revanche on peut utiliser {:?} et {:#?} pour afficher certain types qui ne sont normalement pas affichables
let monvecteur = vec![chaine, "42"];
println!("{:?}", &monvecteur);
println!("{:#?}", monvecteur); // Celui ci est appellé "pretty print"
```