Salt la conținutul principal
Modulul 4 · Lecția 2 din 28/14 în curs~12 min
Lecții din modul (2/2)

Metode și blocuri impl

În Rust, metodele sunt similare cu funcțiile, dar sunt definite în contextul unei structuri (sau unei enumerari sau trăsături), iar primul lor parametru este întotdeauna self, care reprezintă instanța structurii pe care metoda este apelată.

Definirea metodelor cu impl

Pentru a defini metode pe o structura, folosim un bloc impl (implementare) cu numele structurii:

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());
}

Funcții (statice) asociate

Funcțiile definite într-un bloc impl care nu acceptă self ca prim parametru se numesc funcții asociate (echivalent cu metodele statice în alte limbi).

Ele sunt adesea folosite ca constructori pentru a returna instanțe noi ale structurii. Pentru a le apela, utilizați sintaxa două puncte :::

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);
}

Metode care modifică starea: &mut self

Dacă o metodă trebuie să modifice câmpurile structurii, trebuie să declare primul parametru ca &mut self. Instanța în sine pe care este apelată metoda trebuie să fie declarată ca mutabilă (let mut):

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

Încercați-l singur

Exercițiu#rust.m4.l2.e1
Încercări: 0Se încarcă…

Completați blocul impl definind metoda zonei care ia &self și returnează u32 (înmulțirea lățimii și înălțimii).

Se încarcă editorul...
Afișează indiciu

Scrieți `fn area(&self) -> u32 { self.width \* self.height }`în interiorul blocului`impl Rectangle`.

Soluție disponibilă după 3 încercări

Exercițiu#rust.m4.l2.e2
Încercări: 0Se încarcă…

Definiți funcția asociată pătratului în interiorul impl Rectangle, care primește dimensiunea: u32 și returnează o instanță Rectangle cu lățime și înălțime egale cu dimensiunea.

Se încarcă editorul...
Afișează indiciu

Scrieți `fn pătrat(dimensiune: u32) -> Dreptunghi { Dreptunghi { lățime: dimensiune, înălțime: dimensiune } }`în interiorul blocului`impl`.

Soluție disponibilă după 3 încercări

Exercițiu#rust.m4.l2.e3
Încercări: 0Se încarcă…

Adăugați metoda scale mutator la Rectangle în interiorul blocului impl. Metoda scalei trebuie să ia o referință mutabilă la sine (&mut self) și un factor: parametrul u32 și să înmulțească atât lățimea, cât și înălțimea dreptunghiului cu factor.

Se încarcă editorul...
Afișează indiciu

Implementați `fn scale(&mut self, factor: u32)`pentru a actualiza`self.width` și`self.height` înmulțindu-le cu`factor`.

Soluție disponibilă după 3 încercări