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.
- 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
- 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 blocoimpl
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 deself
modificando o cĂłdigo e tentando executarfinish
duas vezes. - Além das variantes de
self
, também existem tipos especiais de wrapper que podem ser tipos de receptores, comoBox<Self>
.
- Mostre que Ă© um termo abreviado para