MĂ©todos

Rust permite que vocĂȘ associe funçÔes aos seus novos tipos. VocĂȘ faz isso com um bloco impl:

#[derive(Debug)]
struct Race {
    name: String,
    laps: Vec<i32>,
}

impl Race {
    // Sem receptor, um método eståtico
    fn new(name: &str) -> Self {
        Self { name: String::from(name), laps: Vec::new() }
    }

    // EmprĂ©stimo Ășnico com acesso de leitura e escrita em self
    fn add_lap(&mut self, lap: i32) {
        self.laps.push(lap);
    }

    // Empréstimo compartilhado com acesso apenas de leitura em self
    fn print_laps(&self) {
        println!("Registrou {} voltas para {}:", self.laps.len(), self.name);
        for (idx, lap) in self.laps.iter().enumerate() {
            println!("Volta {idx}: {lap} seg");
        }
    }

    // Propriedade exclusiva de self
    fn finish(self) {
        let total: i32 = self.laps.iter().sum();
        println!("Corrida {} foi encerrada, tempo total de voltas: {}", self.name, total);
    }
}

fn main() {
    let mut race = Race::new("Monaco Grand Prix");
    race.add_lap(70);
    race.add_lap(68);
    race.print_laps();
    race.add_lap(71);
    race.print_laps();
    race.finish();
    // race.add_lap(42);
}

Os argumentos self especificam o “receptor” - o objeto em que o mĂ©todo age. Existem vĂĄrios receptores comuns para um mĂ©todo:

  • &self: pega emprestado o objeto do chamador como uma referĂȘncia compartilhada e imutĂĄvel. O objeto pode ser usado novamente depois.
  • &mut self: pega emprestado o objeto do chamador como uma referĂȘncia Ășnica e mutĂĄvel. O objeto pode ser usado novamente depois.
  • self: toma posse do objeto e o move do chamador. O mĂ©todo se torna o proprietĂĄrio do objeto. O objeto serĂĄ descartado (desalocado) quando o mĂ©todo retorna, a menos que sua ownership (posse) seja explicitamente transmitida. Posse completa nĂŁo significa automaticamente mutabilidade.
  • mut self: o mesmo que acima, mas o mĂ©todo pode modificar o objeto.
  • Sem receptor: isso se torna um mĂ©todo estĂĄtico (static) no struct. Normalmente usado para criar construtores que, por convenção, sĂŁo chamados new.
This slide should take about 8 minutes.

Pontos Chave:

  • Pode ser Ăștil introduzir mĂ©todos comparando-os com funçÔes.
    • MĂ©todos sĂŁo chamados em uma instĂąncia de um tipo (como struct ou enum), o primeiro parĂąmetro representa a instĂąncia como self.
    • Desenvolvedores podem optar por usar mĂ©todos para aproveitar a sintaxe do receptor do mĂ©todo e ajudar a mantĂȘ-los mais organizados. Usando mĂ©todos, podemos manter todo o cĂłdigo de implementação em um local previsĂ­vel.
  • Destaque o uso da palavra-chave self, um receptor de mĂ©todo.
    • Mostre que Ă© um termo abreviado para self: Self e talvez mostre como o nome da struct tambĂ©m poderia ser usado.
    • Explique que Self Ă© um alias de tipo para o tipo em que o bloco impl estĂĄ e pode ser usado em qualquer outro lugar no bloco.
    • Observe como self Ă© usado como outras structs e a notação de ponto pode ser usada para se referir a campos individuais.
    • Este pode ser um bom momento para demonstrar como &self difere de self modificando o cĂłdigo e tentando executar finish duas vezes.
    • AlĂ©m das variantes de self, tambĂ©m existem tipos especiais de wrapper que podem ser tipos de receptores, como Box<Self>.