پرش به مطلب اصلی

عبارت Match

معرفی

عبارت match ساختاری است که یک مقدار را با چندین الگو مقایسه و تقسیم می‌کند. هنگامی که قصد دارید هدف تقسیم را بهتر از if / else if بیان کنید مفید است.

در حال حاضر match در Wave به صورت statement (عبارت) بوده و از قالب expression (که به مقدار ارزیابی می‌شود) پشتیبانی نمی‌کند. یعنی، var x = match (...) { ... } فرم قابل استفاده نیست.


قانون پایه

match (value) {
pattern1 => {
// بلوک اجرا
}
pattern2 => {
// بلوک اجرا
}
_ => {
// بلوک پیش فرض
}
}

قوانین دستوری:

  • سرآغاز از قالب match (expr) استفاده می‌کند.
  • هر آرنج از قالب { ... } استفاده می‌کند.
  • بدنه آرنج باید به صورت باند { ... } بلوک باشد.
  • درون آرنج می‌توانید فقط یک خط بنویسید، و به عنوان جداکننده از , یا ; استفاده کنید.

انواع الگوها

سه نوع الگوی پشتیبانی شده هم‌اکنون وجود دارد.

  1. الگوی ادبیات عدد صحیح
0 => { ... }
1 => { ... }
42 => { ... }
  1. الگوی اسم مستعار
Off => { ... }
On => { ... }

الگوی اسم مستعار مانند enum variant است که می‌تواند با استفاده از مقادیر عددی صحیح عمل کند.

  1. الگوی wildcard (_)
_ => { ... }

قابل استفاده به عنوان یک آرنج پایه زمانی که هیچ الگوی دیگری مطابقت ندارد.


انواع اهداف مطابقت

فعلا مقدار هدف match باید یک دنباله عدد صحیح/دنباله enum باشد. رشته، نقاط شناور، و ساختارها قابل استفاده به عنوان هدف match نیستند.


مثال 1: تقسیم عدد صحیح

fun classify_num(v: i32) -> i32 {
var result: i32 = -1;

match (v) {
0 => {
result = 10;
}
1 => {
result = 20;
}
_ => {
result = 99;
}
}

return result;
}

مثال 2: تقسیم enum

enum Mode -> i32 {
Off = 0,
On = 1,
Unknown = 2
}

fun classify_mode(m: Mode) -> i32 {
match (m) {
Off => {
return 1;
}
On => {
return 2;
}
_ => {
return 3;
}
}
}

قوانین عملیات

  • در مقایسه با دنباله switch فقط یک آرنج مطابقت یافته اجرا می‌شود.
  • قانون جایگزینی خودکار وجود ندارد.
  • آرنج _ فقط یک بار مجاز به استفاده است.
  • عدم وجود آرنج _ از نظر قانونی مشمول است (اگر آرنج مطابقت یافته‌ای وجود نداشته باشد هیچ آغازی اجرا نمی‌شود)

موارد مورد توجه

  1. ممنوعیت تکرار کیس‌ها
  • اعلان کیس تکراری یک خطای کامپایل را ایجاد می‌کند.
  1. ممنوعیت تکرار _
  • آرنج _ نمی‌تواند بیش از یک بار اعلام شود.
  1. ضرورت بلوک آرنج
  • بعد از => باید یک بلوک باند { ... } نوشته شود.
  1. الگو باید یک عدد صحیح باشد
  • الگوی اسم باید فقط برای اعداد صحیح/بیت‌های variant enum قابل تفسیر باشد.

خلاصه

match در Wave یک عبارت برای تقسیم بهینه اعداد صحیح/enum است. با استفاده از ساختار => + بلوک، و wildcard(_) می‌توان یک تقسیم پایه را تشکیل داد.

هرچه موارد تقسیم بیشتر شود، خواندن if / else if آسانتر است و می‌تواند مقاصد را به وضوح بیان کند.