مقدمه

به فصل «بررسی دقیق‌تر Pattern Matching» خوش آمدید. «الگوها» یا Patterns یکی از ویژگی‌های سینتکسی قدرتمند در Rust هستند که به ما اجازه می‌دهند ساختار یک نوع را با یک مقدار مقایسه کنیم. ما قبلاً با الگوها در عبارات match و دستورات let به صورت ضمنی کار کرده‌ایم. اما الگوها بسیار گسترده‌تر هستند و در بخش‌های مختلفی از زبان ظاهر می‌شوند. درک کامل آنها به ما کمک می‌کند تا کدهای گویاتر و قدرتمندتری بنویسیم.

تمام مکان‌هایی که الگوها استفاده می‌شوند

بیایید مروری بر تمام جاهایی که می‌توان از الگوها استفاده کرد، داشته باشیم.

۱. عبارات match

این رایج‌ترین و واضح‌ترین مکان استفاده از الگوهاست. هر شاخه (arm) از یک عبارت match شامل یک الگو است که مقدار ورودی با آن مقایسه می‌شود.

Copy Icon src/main.rs

let x = Some(5);
match x {
    Some(50) => println!("Got 50"),
    Some(y) => println!("Matched, y = {:?}", y), // This arm will be executed
    _ => println!("Default case"),
}

۲. دستور if let

دستور if let یک میانبر برای match است که تنها زمانی که الگو با مقدار مطابقت دارد، یک بلوک کد را اجرا می‌کند. در اینجا نیز از الگو برای مقایسه استفاده می‌شود.

۳. دستور let

شاید تعجب کنید، اما دستور let نیز از الگوها استفاده می‌کند! سینتکس let PATTERN = EXPRESSION; یک نمونه کامل از pattern matching است. به همین دلیل است که ما می‌توانیم با استفاده از destructuring، مقادیر یک تاپل را به متغیرهای مجزا اختصاص دهیم.

Copy Icon src/main.rs

let (x, y, z) = (1, 2, 3);

در این کد، (x, y, z) یک الگو است که با مقدار تاپل سمت راست مطابقت داده می‌شود و مقادیر به متغیرهای مربوطه bind می‌شوند.

۴. پارامترهای تابع

پارامترهای یک تابع نیز در واقع الگو هستند. شما می‌توانید در تعریف پارامتر یک تابع، از destructuring استفاده کنید.

Copy Icon src/main.rs
fn print_coordinates(&(x, y): &(i32, i32)) {
    println!("Current location: ({}, {})", x, y);
}

fn main() {
    let point = (3, 5);
    print_coordinates(&point);
}

در اینجا، ما به جای تعریف یک پارامتر و سپس destructure کردن آن در داخل تابع، این کار را مستقیماً در امضای تابع انجام داده‌ایم.

خلاصه

در این درس دیدیم که الگوها یک مفهوم بنیادی و فراگیر در زبان Rust هستند و در بخش‌های مختلفی از سینتکس زبان، از match و if let گرفته تا let و پارامترهای توابع، حضور دارند. درک این موضوع به ما کمک می‌کند تا از قدرت کامل زبان برای نوشتن کدهای گویاتر و مختصرتر استفاده کنیم.

اما تمام الگوها یکسان نیستند. برخی از الگوها ممکن است با یک مقدار مطابقت نداشته باشند. در درس بعدی، به بررسی مفهوم «Refutability» خواهیم پرداخت و تفاوت بین الگوهای refutable و irrefutable و اینکه هر کدام در چه زمینه‌ای قابل استفاده هستند را بررسی خواهیم کرد.