Quelle est la différence entre String et str en Rust ? Quand utiliser quoi ?
Bonjour, collègues ! J'ai commencé à apprendre Rust et je suis tombé sur un sujet très déroutant : les chaînes. Dans la documentation, je rencontre constamment `String` et `&str`, mais je n'arrive pas à comprendre la différence entre eux et quand utiliser quel type.
J'ai écrit un petit exemple :
```rust
fn main() {
let s1 = "hello"; // c'est str ?
let s2 = String::from("hello"); // et ça c'est String ?
println!("{}", s1);
println!("{}", s2);
// Pourquoi ça marche ?
let s3: &str = &s2;
println!("{}", s3);
// Et ça non ?
// let s4: String = s1; // erreur !
}
```
Je vois que `s1` est un littéral de chaîne, et `s2` est créé via `String::from()`. Mais quand j'essaie d'assigner `s1` à une variable de type `String`, le compilateur se plaint. Pourtant, je peux prendre une référence sur `s2` et l'assigner à `&str`.
Quelqu'un pourrait-il expliquer en termes simples :
1. Qu'est-ce que `String` et qu'est-ce que `str` ?
2. Pourquoi `str` est-il toujours accompagné d'une esperluette (`&str`) ?
3. Dans quelles situations faut-il utiliser `String`