Strings
Agora podemos entender os dois tipos de strings em Rust:
&str
Ă© uma slice de bytes codificados em UTF-8, similar a&[u8]
.String
Ă© um buffer owned de bytes codificados em UTF-8, similar aVec<T>
.
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[s2.len() - s1.len()..]; println!("s3: {s3}"); }
-
&str
introduz uma slice de string, a qual Ă© uma referĂȘncia imutĂĄvel para os dados da string UTF-8 armazenados em um bloco de memĂłria. Literais de string ("OlĂĄ"
), sĂŁo armazenadas no cĂłdigo binĂĄrio do programa. -
O tipo
String
do Rust Ă© um wrapper (invĂłlucro) ao redor de um vetor 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 pegar emprestado (borrow) slices
&str
deString
via&
e opcionalmente seleção de intervalo. Se vocĂȘ selecionar um intervalo de byte que nĂŁo estĂĄ alinhado com os limites dos caracteres, a expressĂŁo irĂĄ retornar um pĂąnico. O iteradorchars
itera sobre caracteres e Ă© preferĂvel tentar obter os limites dos caracteres corretos. -
Para programadores C++: pense em
&str
comoconst char*
de C++, mas que sempre aponta para uma string vĂĄlida na memĂłria. Em Rust,String
Ă© um equivalente aproximado destd::string
de C++ (principal diferença: ele só pode conter bytes codificados em UTF-8 e nunca usarå uma otimização de string pequena). -
Strings de byte permitem que vocĂȘ crie um valor
&[u8]
diretamente:fn main() { println!("{:?}", b"abc"); println!("{:?}", &[97, 98, 99]); }
-
Strings brutas permitem que vocĂȘ crie um valor
&str
com caracteres de escape desabilitados:r"\n" == "\\n"
. VocĂȘ pode embutir aspas duplas utilizando uma quantidade igual de#
em ambos os lados das aspas:fn main() { println!(r#"<a href="link.html">link</a>"#); println!("<a href=\"link.html\">link</a>"); }