Iniciante Fundamentos
Borrowing
Borrowing (empréstimo) permite usar um valor sem tomar posse dele. Você cria uma referência com &, e o dono original continua válido.
Referência imutável
Com & você empresta o valor só para leitura.
fn tamanho(s: &String) -> usize {
s.len()
}
fn main() {
let texto = String::from("olá");
let n = tamanho(&texto); // empresta, não move
println!("{} tem {} chars", texto, n); // texto ainda válido
}
Referência mutável
Com &mut você pode alterar o valor emprestado. A variável original precisa ser mut.
fn adicionar(s: &mut String) {
s.push_str(" mundo");
}
fn main() {
let mut texto = String::from("olá");
adicionar(&mut texto);
println!("{}", texto); // olá mundo
}
Regras do borrow
- Você pode ter várias referências imutáveis ao mesmo tempo.
- Ou apenas uma referência mutável.
- Nunca as duas coisas ao mesmo tempo.
fn main() {
let mut s = String::from("oi");
let r1 = &s;
let r2 = &s; // ok: várias leituras
println!("{} {}", r1, r2);
let r3 = &mut s; // ok: r1 e r2 já não são usados
r3.push('!');
println!("{}", r3);
}
Essas regras evitam condições de corrida e acessos inválidos em tempo de compilação.