Məzmuna keç
Educora
Başlanğıc16 dəq2 / 10

Dəyişənlər, dəyişkənlik və tiplər

`let` və `mut` ilə dəyişənlər yarat, kölgələmədən istifadə et, Rust-ın skalyar tiplərini (tam və kəsr ədədlər, `bool`, `char`) və mürəkkəb tiplərini (kortej və massiv) öyrən.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Dəyişməz və mut ilə dəyişdirilə bilən dəyişənlər yaratmaq, sabitləri const ilə elan etmək
  • Kölgələmənin mut-dan fərqini izah etmək
  • Düzgün tam ədəd, kəsr ədəd, bool və char tipini seçmək və daşmanı təhlükəsiz idarə etmək
  • Kortejlər və massivlərlə işləmək

Bank kartındakı balans hər gün dəyişir, doğum tarixin isə heç vaxt. Bir çox dildə hər iki qiymət eyni cür saxlanılır və təsadüfən doğum tarixini «dəyişmək» mümkündür. Rust səni əvvəlcədən qərar verməyə məcbur edir: dəyişən standart olaraq dəyişməzdir və dəyişə bilməsi üçün bunu açıq şəkildə yazmalısan.

let, mut və const

Dəyişən let açar sözü ilə yaradılır. Tipi yazmaq çox vaxt lazım deyil: kompilyator onu qiymətdən özü çıxarır. Dəyişənin qiyməti sonra dəyişəcəksə, adından əvvəl mut (ingiliscə mutable — dəyişdirilə bilən) yaz. Rust-da dəyişən adları snake_case üslubunda yazılır: total_score, user_name.

Rust
fn main() {
    let city = "Baku";
    let mut score = 10;
    println!("{city}: {score}");

    score += 5;
    println!("{city}: {score}");
}
Gözlənilən nəticə
Baku: 10
Baku: 15
Xəta E0384
fn main() {
    let score = 10;
    println!("{score}");
    score = 15;
    println!("{score}");
}
`mut` ilə düzgün
fn main() {
    let mut score = 10;
    println!("{score}");
    score = 15;
    println!("{score}");
}
Dəyişməz dəyişənə ikinci dəfə qiymət vermək olmaz. Sağdakı proqram 10 və 15 çap edir.
Text
error[E0384]: cannot assign twice to immutable variable `score`
 --> src/main.rs:4:5
  |
2 |     let score = 10;
  |         ----- first assignment to `score`
3 |     println!("{score}");
4 |     score = 15;
  |     ^^^^^^^^^^ cannot assign twice to immutable variable
  |
help: consider making this binding mutable
  |
2 |     let mut score = 10;
  |         +++
Rust-ın xəta mesajları çox ətraflıdır: problem olan sətri göstərir və düzəlişi də təklif edir (+++ əlavə olunmalı mətni işarələyir).

Sabitlər const ilə elan olunur. Onların tipi həmişə yazılmalıdır, adları BÖYÜK_HƏRFLƏRLƏ yazılır və qiyməti kompilyasiya zamanı məlum olmalıdır. Sabiti main-dən kənarda, faylın yuxarısında da elan etmək olar.

Rust
const MAX_PLAYERS: u32 = 4;
const SECONDS_PER_HOUR: u32 = 60 * 60;

fn main() {
    println!("Players: {}", MAX_PLAYERS);
    println!("Seconds in 2 hours: {}", 2 * SECONDS_PER_HOUR);
}
Gözlənilən nəticə
Players: 4
Seconds in 2 hours: 7200

Kölgələmə

Eyni adla yenidən let yazsan, köhnə dəyişənin üstünü örtən yeni dəyişən yaranır — buna kölgələmə (shadowing) deyilir. Kölgələmə ilə qiymətin hətta tipini də dəyişmək olar. Daxili blokda ({ }) edilən kölgələmə isə blok bitəndə yox olur.

Rust
fn main() {
    let spaces = "   ";
    let spaces = spaces.len();
    println!("spaces = {spaces}");

    let x = 5;
    let x = x + 1;
    {
        let x = x * 2;
        println!("inner x = {x}");
    }
    println!("outer x = {x}");
}
Gözlənilən nəticə
spaces = 3
inner x = 12
outer x = 6
spaces əvvəl mətn idi, sonra ədəd oldu. mut ilə bu mümkün olmazdı: mut dəyişənin qiymətini dəyişməyə icazə verir, tipini isə yox.

Skalyar tiplər

Skalyar tip tək bir qiymət saxlayır. Rust-da onların dörd növü var: tam ədədlər, kəsr ədədlər (sürüşən nöqtəli), məntiqi bool (true/false) və simvol char. Tam ədədlərin adı işarəni və ölçünü göstərir: i — işarəli (mənfi də ola bilər), u — işarəsiz, rəqəm isə bitlərin sayıdır. Tip göstərilməsə, tam ədəd i32, kəsr ədəd isə f64 olur.

TipDiapazon və ya məzmunHarada lazımdır
u80 … 255baytlar, rəng komponentləri, yaş
i32−2 147 483 648 … 2 147 483 647adi tam ədədlər (standart tip)
i64, u64təxminən ±9,2 · 10¹⁸böyük saylar, vaxt ştampları
usize64 bitlik sistemdə 64 bitindekslər və uzunluqlar
f64təxminən 15–16 dəqiq rəqəmkəsr ədədlər (standart tip)
booltrue, falseşərtlər
charistənilən Unicode simvolu, 4 bayttək hərflər və işarələr
Rust
fn main() {
    let age: u8 = 14;
    let temperature: i32 = -3;
    let price: f64 = 2.5;
    let whole: f64 = 10.0;
    let is_open = true;
    let currency = '₼';

    println!("{age} {temperature} {price} {whole} {is_open} {currency}");
    println!("{:?} {:.2}", whole, price);
    println!("{} {} {}", 7 / 2, 7 % 2, 7.0 / 2.0);
    println!("{} {}", 3.9_f64 as i32, u8::MAX);
}
Gözlənilən nəticə
14 -3 2.5 10 true ₼
10.0 2.50
3 1 3.5
3 255
Diqqət et: {} 10.0-ı 10 kimi, {:?} isə 10.0 kimi çap edir. {:.2} vergüldən sonra iki rəqəm saxlayır. Tam ədədlərin bölünməsi kəsr hissəni atır, as isə tipi çevirir.
Rust
fn main() {
    let level: u8 = 250;
    println!("{:?}", level.checked_add(10));
    println!("{:?}", level.checked_add(5));
    println!("{}", level.saturating_add(10));
    println!("{}", level.wrapping_add(10));
}
Gözlənilən nəticə
None
Some(255)
255
4
Some və None «qiymət var» və «qiymət yoxdur» deməkdir — bu Option tipi ilə 5-ci dərsdə tanış olacaqsan. 250 + 10 = 260, 260 − 256 = 4.

Mürəkkəb tiplər: kortejlər və massivlər

Kortej (tuple) müxtəlif tipli bir neçə qiyməti bir yerdə saxlayır: ("Murad", 15, 4.5). Onun elementlərinə nöqtə və indekslə (student.0) müraciət olunur və ya kortej let (a, b, c) = ... ilə ayrı dəyişənlərə açılır. Massiv isə eyni tipli, ölçüsü sabit olan elementlər ardıcıllığıdır: tipi [i32; 5] kimi yazılır, elementlərə days[0] ilə müraciət olunur.

Rust
fn main() {
    let student: (&str, u8, f64) = ("Murad", 15, 4.5);
    let (name, age, grade) = student;
    println!("{name} is {age}, average grade {grade}");
    println!("First field: {}", student.0);

    let days = ["Mon", "Tue", "Wed", "Thu", "Fri"];
    let zeros = [0; 3];
    println!("{} days, first: {}", days.len(), days[0]);
    println!("{:?}", zeros);
    println!("{:?}", student);
}
Gözlənilən nəticə
Murad is 15, average grade 4.5
First field: Murad
5 days, first: Mon
[0, 0, 0]
("Murad", 15, 4.5)
[0; 3] «üç sıfır» deməkdir. Massivləri və kortejləri {:?} ilə çap etmək lazımdır; {:?} mətnləri dırnaqla göstərir.

Əsas fikirlər

  • Rust-da dəyişənlər standart olaraq dəyişməzdir; dəyişmək üçün let mut yazılır.
  • const sabitinin tipi mütləq yazılır və qiyməti kompilyasiya zamanı məlum olmalıdır.
  • Kölgələmə eyni adla yeni dəyişən yaradır və tipi dəyişməyə imkan verir.
  • Standart tiplər: tam ədəd üçün i32, kəsr ədəd üçün f64; char istənilən Unicode simvoludur.
  • Daşmanı checked_add, saturating_add, wrapping_add ilə açıq idarə et.
  • Kortej müxtəlif tipləri, massiv isə eyni tipli sabit sayda elementi saxlayır.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
let x = 5; x = 6; kodu ilə nə baş verir?