String vs str
Agora podemos entender os dois tipos de strings em Rust:
fn main() { let s1: &str = "Mundo"; println!("s1: {s1}"); let mut s2: String = String::from("Olá "); println!("s2: {s2}"); s2.push_str(s1); println!("s2: {s2}"); let s3: &str = &s2[6..]; println!("s3: {s3}"); }
Terminologia do Rust:
&stré uma referência imutável para uma slice de string.Stringé um buffer de string mutável.
-
&strintroduz uma slice de string, a qual é uma referência imutável para os dados da string em formato UTF-8 armazenados em um bloco de memória. Literais de string ("Hello") são armazenadas no código binário do programa. -
O tipo
Stringdo Rust é um invólucro ao redor de uma matriz de bytes. Assim como umVec<T>, ele é owned. -
Da mesma forma que outros tipos,
String::from()cria uma string a partir de um literal;String::new()cria uma nova string vazia, na qual dados de string podem ser adicionados com os métodospush()epush_str(). -
A macro
format!()é uma maneira conveniente de gerar uma string owned a partir de valores dinâmicos. Ela aceita os mesmos formatadores queprintln!(). -
Você pode emprestar slices
&strdeStringatravés do operador&e, opcionalmente, selecionar um range (“intervalo”). -
Para programadores C++: pense em
&strcomoconst char*de C++, mas que sempre aponta para uma string válida na memória. Em Rust,Stringé um equivalente aproximado destd::stringde C++ (principal diferença: ele só pode conter bytes codificados em UTF-8 e nunca usará uma otimização de string pequena).