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.