Pular para o conteúdo principal
Módulo 4 · Lição 2 de 28/14 no curso~12 min
Lições do módulo (2/2)

Métodos e blocos impl

No Rust, os métodos são semelhantes às funções, mas são definidos no contexto de uma struct (ou enum ou trait), e seu primeiro parâmetro é sempre self, que representa a instância da struct na qual o método está sendo chamado.

Definindo métodos com impl

Para definir métodos em uma estrutura, usamos um bloco impl (implementação) com o nome da estrutura:

Rust
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    // This is an instance method. It takes &self for reading.
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rect = Rectangle { width: 30, height: 50 };

    // Call the method using dot notation
    println!("The area is: {}", rect.area());
}

Funções associadas (estáticas)

Funções definidas em um bloco impl que não aceitam self como seu primeiro parâmetro são chamadas de funções associadas (equivalente a métodos estáticos em outras linguagens).

Eles são frequentemente usados ​​como construtores para retornar novas instâncias da estrutura. Para chamá-los, use a sintaxe de dois pontos duplos :::

Rust
impl Rectangle {
    // Associated function
    fn square(size: u32) -> Rectangle {
        Rectangle {
            width: size,
            height: size,
        }
    }
}

fn main() {
    // Call the associated function
    let sq = Rectangle::square(10);
}

Métodos que modificam o estado: &mut self

Se um método precisar modificar os campos da struct, ele deverá declarar seu primeiro parâmetro como &mut self. A própria instância na qual o método é chamado deve ser declarada como mutável (let mut):

Rust
impl Rectangle {
    fn double_size(&mut self) {
        self.width *= 2;
        self.height *= 2;
    }
}

Experimente você mesmo

Exercício#rust.m4.l2.e1
Tentativas: 0Carregando…

Complete o bloco impl definindo o método area que pega &self e retorna u32 (a multiplicação de largura e altura).

Carregando editor…
Mostrar dica

Escreva `fn area(&self) -> u32 { self.width \* self.height }`dentro do bloco`impl Rectangle`.

Solução disponível após 3 tentativas

Exercício#rust.m4.l2.e2
Tentativas: 0Carregando…

Defina a função quadrada associada dentro de impl Rectangle, que recebe size: u32 e retorna uma instância de Rectangle com largura e altura iguais a size.

Carregando editor…
Mostrar dica

Escreva `fn square(size: u32) -> Rectangle { Rectangle { width: size, height: size } }`dentro do bloco`impl`.

Solução disponível após 3 tentativas

Exercício#rust.m4.l2.e3
Tentativas: 0Carregando…

Adicione o método modificador de escala a Rectangle dentro do bloco impl. O método de escala deve usar uma referência mutável a self (&mut self) e um parâmetro factor: u32 e multiplicar a largura e a altura de Rectangle por fator.

Carregando editor…
Mostrar dica

Implemente `fn scale(&mut self, factor: u32)`para atualizar`self.width`e`self.height`multiplicando-os por`factor`.

Solução disponível após 3 tentativas