Przejdź do głównej treści
eLearner.app
Moduł 1 · Lekcja 1 z 21/14 w kursie~10 min
Lekcje modułu (1/2)

Zmienne i mutowalność

W języku Rust zarządzanie zmiennymi i pamięcią kieruje się dwiema fundamentalnymi zasadami: bezpieczeństwem i kontrolą. Z tego powodu, w przeciwieństwie do wielu innych języków programowania, zmienne w Rust są domyślnie niezmienne (immutabili).

Oznacza to, że po przypisaniu wartości do zmiennej nie można jej modyfikować. Próba wykonania takiej operacji spowoduje błąd kompilatora.

Zmienne niezmienne i słowo kluczowe mut

Do deklaracji zmiennej używa się słowa kluczowego let:

Code
let x = 5; // Immutabile di default
// x = 6; // ERRORE! Il compilatore si rifiuterà di compilare.

Jeśli potrzebujesz zmodyfikować wartość zmiennej, musisz uczynić ją jawnie zmienną (mutabile) za pomocą słowa kluczowego mut tuż po let:

Code
let mut y = 10; // Mutabile
println!("Il valore di y e: {}", y);
y = 15; // Valido!
println!("Il valore modificato di y e: {}", y);

Użycie prefiksu mut jasno informuje kompilator oraz osobę czytającą kod, że dana wartość ulegnie zmianie w trakcie działania programu.

Shadowing (Zasłanianie)

Rust pozwala również na koncept shadowingu (zasłaniania), czyli ponownej deklaracji zmiennej o tej samej nazwie przy użyciu słowa kluczowego let. Nowa zmienna "zasłania" poprzednią zmienną:

Code
let x = 5;
let x = x + 1; // Shadowing: x ora vale 6
let x = x * 2; // Shadowing: x ora vale 12

W przeciwieństwie do mut, shadowing pozwala na:

  1. Zmianę typu danych zmiennej przy zachowaniu tej samej nazwy.
  2. Zachowanie niezmienności (immutabilità) zmiennej po dokonaniu transformacji.
Code
let spaces = "   "; // Tipo: &str (stringa)
let spaces = spaces.len(); // Tipo: usize (numero intero)

Przydatność shadowingu i zakresy (Scope)

Shadowing nie ogranicza się do tego samego bloku kodu; może być użyty wewnątrz zagnieżdżonych bloków ({}), aby tymczasowo nadpisać wartość. Kiedy wewnętrzny blok się skończy, oryginalna zmienna staje się ponownie widoczna:

Code
let x = 5;
{
    let x = x * 2; // Shadowing valido solo all'interno del blocco
    println!("Valore nel blocco interno: {}", x); // Stampa 10
}
println!("Valore nel blocco esterno: {}", x); // Stampa 5

Mechanizm ten jest niezwykle bezpieczny i wydajny, ponieważ odbywa się całkowicie w czasie kompilacji, zapewniając bezpieczeństwo typów bez jakichkolwiek kosztów wydajnościowych w czasie wykonywania programu.


Spróbuj sam

Ćwiczenie#rust.m1.l1.e1
Próby: 0Ładowanie...

Zadeklaruj zmienną modyfikowalną o nazwie x z wartością początkową 5. Następnie dodaj 10 do x i wypisz ją na ekranie za pomocą makra println!.

Ładowanie edytora...
Pokaż wskazówkę

Zadeklaruj zmienną za pomocą `let mut x = 5;`, następnie zwiększ ją o `x += 10;` (lub `x = x + 10;`), a na koniec wypisz ją za pomocą `println!('{}', x);`.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#rust.m1.l1.e2
Próby: 0Ładowanie...

Zadeklaruj zmienną niezmienną y o wartości 10. Wykonaj shadowing zmiennej y, deklarując ją ponownie za pomocą let w celu pomnożenia jej poprzedniej wartości przez 2, a na koniec wypisz ją za pomocą println!.

Ładowanie edytora...
Pokaż wskazówkę

Użyj `let y = 10;`, a następnie wykonaj shadowing deklarując ją ponownie za pomocą `let y = y * 2;` i na koniec użyj `println!`, aby ją wyświetlić.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#rust.m1.l1.e3
Próby: 0Ładowanie...

Zadeklaruj niezmienną zmienną input zawierającą wartość tekstową "42". Wykonaj shadowing zmiennej input, deklarując ją jako liczbę całkowitą typu i32 poprzez konwersję oryginalnej wartości za pomocą input.parse::<i32>().unwrap(). Na koniec wypisz ją za pomocą makra println!.

Ładowanie edytora...
Pokaż wskazówkę

Zadeklaruj `let input = "42";`, a następnie wykonaj shadowing za pomocą `let input: i32 = input.parse().unwrap();` i wypisz ją za pomocą `println!("{}", input);`.

Rozwiązanie dostępne po 3 próbach