Rust Vs Python Strings
Rust Vs Python Strings
Pensou por 5s
Claro. Vamos fazer isso do jeito certo: comparando Python com Rust, porque isso acelera
muito o aprendizado.
Visão geral
Em Python, você normalmente usa só str e pronto:
nomePython
= "Gandra" Executar
Em Rust, a história é diferente. Existem dois tipos muito importantes para texto:
String
&str
A diferença principal é:
String = texto dono dos dados, alocado dinamicamente
Intuição rápida
Pense assim:
String em Rust se parece com algo “mais dono” do valor, parecido com um objeto
Em Python, as strings são objetos imutáveis e você quase nunca pensa em posse ou
empréstimo.
Em Rust, isso é central.
[Link] 1/46
09/03/2026, 14:52 Rust vs Python Strings
fn main() {
let nome: &str = "Gandra";
println!("{}", nome);
}
Rust
Ou seja:
nomePython
= "Gandra" Executar
Em Rust, esse mesmo caso fica mais explícito: o literal é uma referência para dados fixos.
fn main() {
let nome: String = String::from("Gandra");
println!("{}", nome);
}
Rust
[Link] 2/46
09/03/2026, 14:52 Rust vs Python Strings
Aqui:
é criada uma string dinâmica
os dados ficam na heap
a variável nome é a proprietária desse conteúdo
fn main() {
let s: &str = "Olá";
println!("{}", s);
}
Rust
Você não consegue “aumentar” esse texto diretamente.
fn main() {
let mut s = String::from("Olá");
s.push_str(", mundo");
println!("{}", s);
}
R t
s = "Olá"
s += ", mundo"
print(s)
Python Executar
fn main() {
let nome = "Gandra";
let msg = saudacao(nome);
println!("{}", msg);
}
[Link] 4/46
09/03/2026, 14:52 Rust vs Python Strings
O que observar
A função recebe &str porque:
Exemplo
fn imprimir(texto: &str) {
println!("{}", texto);
}
Rust
fn imprimir(texto: &str) {
println!("{}", texto);
}
fn main() {
let a = "literal";
let b = String::from("dinâmica");
imprimir(a);
imprimir(&b);
}
[Link] 5/46
09/03/2026, 14:52 Rust vs Python Strings
Exemplo
Aqui faz sentido retornar String , porque a função está criando um novo valor.
fn main() {
let s = String::from("Olá");
let fatia: &str = &s;
println!("{}", fatia);
}
R t
Também pode usar:
[Link] 6/46
09/03/2026, 14:52 Rust vs Python Strings
fn main() {
let s: &str = "Olá";
let dono: String = s.to_string();
println!("{}", dono);
}
Rust
Ou:
let Rust
dono = String::from(s);
Em Python
Você quase sempre manipula referências para objetos sem perceber.
Em Rust
O compilador te obriga a deixar claro:
isso é posse?
isso é empréstimo?
isso pode ser modificado?
isso vai viver por quanto tempo?
fn main() {
let s1 = "abc";
let s2 = String::from("rust");
[Link] 7/46
09/03/2026, 14:52 Rust vs Python Strings
println!("{}", contar_chars(s1));
println!("{}", contar_chars(&s2));
}
String
&str
fn main() {
let nome = String::from("Gandra");
let outro = nome;
println!("{}", nome);
}
R t
[Link] 8/46
09/03/2026, 14:52 Rust vs Python Strings
O que acontece?
Isso dá erro, porque:
nome = "Gandra"
outro = nome
print(nome)
Python Executar
fn main() {
let nome = String::from("Gandra");
let outro = &nome;
println!("{}", nome);
println!("{}", outro);
}
Aqui:
nome continua dono
outro só empresta
Para funções:
receber texto → prefira &str
retornar texto novo → use String
Para variáveis:
texto fixo/literal → &str
texto construído/modificado dinamicamente → String
nome = "João"
print(adicionar_sobrenome(nome))
print(nome)
Rust
fn main() {
let nome = "João";
let completo = adicionar_sobrenome(nome);
println!("{}", completo);
println!("{}", nome);
}
Leitura didática
nome entra como &str
devolve String
fn main() {
let u1 = "admin";
let u2 = String::from("gandra");
println!("{}", eh_admin(u1));
println!("{}", eh_admin(&u2));
}
Perceba a vantagem: a função aceita os dois casos sem forçar alocação extra.
[Link] 11/46
09/03/2026, 14:52 Rust vs Python Strings
Em Rust idiomático:
Isso reduz cópias, evita moves desnecessários e deixa o código mais expressivo.
fn exibir(texto: &str) {
println!("Texto: {}", texto);
}
fn main() {
let literal = "Olá";
let dinamica = String::from("Mundo");
exibir(literal);
exibir(&dinamica);
dinamica é String
[Link] 12/46
09/03/2026, 14:52 Rust vs Python Strings
Fechamento
A forma mais correta de pensar, vindo de Python, é:
String = dono
&str = empréstimo
fn processa(texto:
Rust &str) -> String
Esse formato aparece o tempo todo em Rust real, porque é um excelente equilíbrio:
entrada por referência
saída com posse
Resposta direta
Raramente existe str sozinho porque str é um tipo de tamanho dinâmico
(dynamically sized type, DST).
Isso significa que o compilador não sabe, em tempo de compilação, quantos bytes um
str ocupa.
E em Rust, quase tudo que fica em variável local, parâmetro por valor ou campo comum
precisa ter tamanho conhecido em tempo de compilação.
[Link] 13/46
09/03/2026, 14:52 Rust vs Python Strings
&str
Box<str>
dentro de String
nomePython
= "gandra" Executar
Se o tipo não tem tamanho conhecido, ele não pode ser usado sozinho da forma
comum.
Mas ele não carrega, sozinho de forma simples e copiável, um tamanho fixo que permita
algo como:
Isso não funciona da forma normal porque str tem comprimento variável.
[Link] 14/46
09/03/2026, 14:52 Rust vs Python Strings
fn main() {
let s: &str = "Olá";
println!("{}", s);
}
Rust
&str = um “controle remoto” que aponta para esse texto e sabe onde ele começa e
quanto mede
[Link] 15/46
09/03/2026, 14:52 Rust vs Python Strings
let Rust
a: [i32; 4] = [1, 2, 3, 4];
Slice
let Rust
s: &[i32] = &a[..];
Por isso você quase nunca usa [i32] sozinho, e sim &[i32] .
&str
&[i32]
e não:
str
[i32]
[Link] 16/46
09/03/2026, 14:52 Rust vs Python Strings
Porque String é um tipo “completo”, com tamanho conhecido, que gerencia um buffer
dinâmico.
Esses metadados têm tamanho fixo, mesmo que o texto armazenado tenha tamanho
variável.
let Rust
s: String = String::from("Olá");
A variável s não contém diretamente todos os bytes da string dentro dela na stack.
Ela contém uma estrutura de tamanho fixo que administra os bytes na heap.
“Se &str existe, então str deveria ser uma string normal.”
Mas não.
str não é o equivalente direto de String .
str → texto fatiado, sem tamanho fixo, geralmente usado por referência
let Rust
texto: str = "abc";
[Link] 17/46
09/03/2026, 14:52 Rust vs Python Strings
Isso falha porque str não pode viver sozinho como variável local comum.
let Rust
texto: &str = "abc";
E Box<str> ?
Existe, e é um caso em que você consegue ter um str “possuído”, mas indiretamente:
[Link] 18/46
09/03/2026, 14:52 Rust vs Python Strings
&str
String
Box<str>
Rust
do que:
str
Rust
Tabela mental
Tem tamanho Pode aparecer
Tipo conhecido? sozinho facilmente? Uso comum
[Link] 19/46
09/03/2026, 14:52 Rust vs Python Strings
fn main() {
let literal: &str = "Rust";
let owned: String = String::from("Python");
let boxed: Box<str> = "Go".into();
println!("{}", literal);
println!("{}", owned);
println!("{}", boxed);
}
Aqui:
Conclusão
str raramente aparece sozinho porque ele não é um valor de tamanho fixo que o
Na próxima etapa, o ideal é eu te mostrar como String faz deref para &str , porque isso
explica por que funções com &str aceitam String tão bem.
[Link] 20/46
09/03/2026, 14:52 Rust vs Python Strings
continue
No caso de strings:
fn exibir(texto: &str) {
println!("{}", texto);
}
fn main() {
let nome = String::from("Gandra");
exibir(&nome);
}
Isso funciona.
Em Python, você não percebe esse tipo de conversão porque tudo já chega de forma bem
flexível:
nome = "Gandra"
exibir(nome)
P th E t
Em Rust, a diferença é que os tipos são muito mais explícitos.
Mesmo assim, o compilador ajuda em vários casos com coerções automáticas seguras.
O que é “deref”?
“Deref” vem de dereference, isto é, “seguir” um ponteiro/referência até o dado interno.
Em Rust, alguns tipos sabem como se comportar como se contivessem outro tipo.
Então, conceitualmente:
fn exibir(texto: &str) {
println!("{}", texto);
}
fn main() {
let s = String::from("Olá");
exibir(&s);
}
[Link] 22/46
09/03/2026, 14:52 Rust vs Python Strings
Forma explícita
fn exibir(texto: &str) {
println!("{}", texto);
}
fn main() {
let s = String::from("Olá");
exibir(s.as_str());
}
As duas funcionam.
exibir(&s);
Rust
fn main() {
let literal = "rust";
let dinamica = String::from("python");
println!("{}", tamanho(literal));
println!("{}", tamanho(&dinamica));
}
Isso é um dos motivos de &str ser o melhor tipo para parâmetros de leitura.
Veja:
fn exibir(texto: &String) {
println!("{}", texto);
}
Rust
fn exibir(texto: &String) {
println!("{}", texto);
}
fn main() {
let s = String::from("Olá");
exibir(&s); // ok
// exibir("Olá"); // erro
}
[Link] 24/46
09/03/2026, 14:52 Rust vs Python Strings
Já com &str :
fn exibir(texto: &str) {
println!("{}", texto);
}
fn main() {
let s = String::from("Olá");
exibir("Olá"); // ok
exibir(&s); // ok
}
Porque aceita:
string literal
String
partes de strings
slices textuais
[Link] 25/46
09/03/2026, 14:52 Rust vs Python Strings
fn main() {
let s = String::from("abcdef");
let parte: &str = &s[0..3];
println!("{}", parte);
}
s = "abcdef"
parte = s[0:3]
print(parte)
Python Executar
Em Rust, &s[0..3] é uma fatia referenciada do texto, desde que respeite fronteiras UTF-8
válidas.
[Link] 26/46
09/03/2026, 14:52 Rust vs Python Strings
s = "abc"
print(s[0])
Python Executar
let s = String::from("abc");
// let c = s[0]; // erro
Rust
Porque strings em Rust são UTF-8, e um “caractere visual” pode ocupar mais de um byte.
fn main() {
let s = "áéí";
for c in [Link]() {
println!("{}", c);
}
}
Deref<Target = str>
Rust
Isso significa que uma referência para String pode ser tratada como referência para
str .
Você não precisa decorar a trait agora, mas precisa entender o efeito prático:
[Link] 27/46
09/03/2026, 14:52 Rust vs Python Strings
fn main() {
let s = String::from("rust");
println!("{}", [Link]());
println!("{}", [Link]("us"));
}
fn saudar(nome: &String) {
println!("Olá, {}", nome);
}
Rust
Aceita só &String .
2. Melhor
[Link] 28/46
09/03/2026, 14:52 Rust vs Python Strings
fn saudar(nome: &str) {
println!("Olá, {}", nome);
}
Rust
fn main() {
let nome = String::from("Gandra");
let resultado = prefixar("Sr. ", &nome);
println!("{}", resultado);
}
Leitura didática
prefixo é &str
valor é &str
[Link] 29/46
09/03/2026, 14:52 Rust vs Python Strings
let Rust
s = "abc"; // &str
funcao(&s);
Rust // &String -> &str
ou
funcao(s.as_str());
Rust
String
possui o texto
pode crescer e ser modificado
aloca dinamicamente
str
é o tipo textual base
tem tamanho dinâmico
raramente aparece sozinho
&str
é referência para str
muito usado para leitura
flexível e idiomático
Deref coercion
permite que &String vire &str automaticamente em muitos contextos
[Link] 31/46
09/03/2026, 14:52 Rust vs Python Strings
fn ler(texto: &str) {
println!("{}", texto);
}
fn main() {
let a: &str = "literal";
let b: String = String::from("dinâmico");
ler(a);
ler(&b);
let c = criar();
ler(&c);
}
sim, continue
Perfeito. Agora vamos montar a tabela mental definitiva e depois eu vou te mostrar
quando cada um aparece no código real.
Visão geral
Os quatro nomes que mais confundem no começo são:
String
&String
str
&str
[Link] 32/46
09/03/2026, 14:52 Rust vs Python Strings
Tabela definitiva
É dono do Tem tamanho Usado
Tipo texto? conhecido? sozinho? Uso real
1. String
O que é
String é o tipo que possui o texto.
Exemplo:
fn main() {
let nome: String = String::from("Gandra");
println!("{}", nome);
}
Rust
[Link] 33/46
09/03/2026, 14:52 Rust vs Python Strings
tamanho atual
capacidade
Ou seja, ela é uma estrutura de tamanho fixo que administra um buffer de tamanho
variável na heap.
2. &String
O que é
&String é uma referência para uma String .
Exemplo:
fn main() {
let nome = String::from("Gandra");
let referencia: &String = &nome;
println!("{}", referencia);
}
3. str
O que é
str é o tipo textual base.
[Link] 34/46
09/03/2026, 14:52 Rust vs Python Strings
let Rust
x: str = ...;
Porque str sozinho não cabe no modelo normal de variável local comum.
4. &str
O que é
&str é uma referência para um texto.
Exemplo:
fn main() {
let s: &str = "Olá";
println!("{}", s);
}
Rust
Esse é o tipo mais comum para ler texto.
[Link] 35/46
09/03/2026, 14:52 Rust vs Python Strings
Pense assim
str é o tipo textual fundamental
String
Rust
str Rust
&strRust
&String
Rust
fn mostrar(texto: &str) {
println!("{}", texto);
}
[Link] 36/46
09/03/2026, 14:52 Rust vs Python Strings
fn main() {
let a: &str = "literal";
let b: String = String::from("dinâmico");
let c: &String = &b;
let d: &str = &b;
mostrar(a);
mostrar(c);
mostrar(d);
}
b é String
c é &String
Veja:
fn exibir(texto: &String) {
println!("{}", texto);
}
Rust
let s = String::from("abc");
exibir(&s);
Rust
exibir("abc");
Rust
[Link] 37/46
09/03/2026, 14:52 Rust vs Python Strings
fn exibir(texto: &str) {
println!("{}", texto);
}
Rust
Essa aceita:
let s = String::from("abc");
exibir(&s);
exibir("abc");
Rust
fn saudacao(nome: &String) {
println!("Olá, {}", nome);
}
Rust
[Link] 38/46
09/03/2026, 14:52 Rust vs Python Strings
Mais idiomático
fn saudacao(nome: &str) {
println!("Olá, {}", nome);
}
Rust
A segunda é melhor porque aceita mais casos sem custo extra desnecessário.
Em Rust, o equivalente mais flexível a esse “recebo qualquer texto para leitura” é:
fn saudacao(nome:
Rust &str)
Por exemplo:
let Rust
s: &str = "abc";
Outro exemplo:
[Link] 39/46
09/03/2026, 14:52 Rust vs Python Strings
let Rust
parte = &texto[0..3];
Ou seja, str está sempre ali como tipo base, mas quase sempre atrás de referência.
Pode aparecer:
Mas em código bom, função de leitura geralmente recebe &str , não &String .
Exemplo:
fn main() {
let mut s = String::from("Olá");
s.push_str(" mundo");
println!("{}", s);
}
R t
fn main() {
let s: &str = "Olá";
println!("{}", s);
}
Rust
&str é só uma visão para leitura do texto.
&str
String
&mut String
Por exemplo:
Aqui faz sentido usar &mut String , porque você quer modificar a string dona.
[Link] 41/46
09/03/2026, 14:52 Rust vs Python Strings
fn validar_email(email:
Rust &str) -> bool
Receber posse
fn consumir_texto(s: String)
Rust
Esse último só faz sentido se a função realmente precisa ficar com a posse.
[Link] 42/46
09/03/2026, 14:52 Rust vs Python Strings
fn ler(texto: &str) {
println!("Lendo: {}", texto);
}
fn main() {
let literal: &str = "olá";
let mut dono: String = String::from("rust");
let referencia_string: &String = &dono;
let referencia_texto: &str = &dono;
ler(literal);
ler(referencia_string);
ler(referencia_texto);
alterar(&mut dono);
[Link] 43/46
09/03/2026, 14:52 Rust vs Python Strings
ler(referencia_string);
Funciona porque Rust converte &String para &str .
alterar(&mut dono);
Agora estamos emprestando a String com mutabilidade.
“Se eu tenho um texto dinâmico, então devo passar &String para funções.”
Não.
Quase sempre a função não quer saber se você tem uma String , um literal ou uma fatia.
Ela quer só ler texto.
String
“Eu sou dono do texto.”
&String
“Eu emprestei a caixa que é dona do texto.”
str
“Eu sou o texto base, mas meu tamanho não é fixo.”
&str
“Eu sou uma visão emprestada do texto.”
[Link] 44/46
09/03/2026, 14:52 Rust vs Python Strings
conteúdo.
Rust
fn main() {
let titulo = Strin
[Link] 45/46
09/03/2026, 14:52 Rust vs Python Strings
[Link] 46/46