عبارت Match
معرفی
عبارت match ساختاری است که یک مقدار را با چندین الگو مقایسه و تقسیم میکند.
هنگامی که قصد دارید هدف تقسیم را بهتر از if / else if بیان کنید مفید است.
در حال حاضر match در Wave به صورت statement (عبارت) بوده و از قالب expression (که به مقدار ارزیابی میشود) پشتیبانی نمیکند.
یعنی، var x = match (...) { ... } فرم قابل استفاده نیست.
قانون پایه
match (value) {
pattern1 => {
// بلوک اجرا
}
pattern2 => {
// بلوک اجرا
}
_ => {
// بلوک پیش فرض
}
}
قوانین دستوری:
- سرآغاز از قالب
match (expr)استفاده میکند. - هر آرنج از قالب
{ ... }استفاده میکند. - بدنه آرنج باید به صورت باند
{ ... }بلوک باشد. - درون آرنج میتوانید فقط یک خط بنویسید، و به عنوان جداکننده از
,یا;استفاده کنید.
انواع الگوها
سه نوع الگوی پشتیبانی شده هماکنون وجود دارد.
- الگوی ادبیات عدد صحیح
0 => { ... }
1 => { ... }
42 => { ... }
- الگوی اسم مستعار
Off => { ... }
On => { ... }
الگوی اسم مستعار مانند enum variant است که میتواند با استفاده از مقادیر عددی صحیح عمل کند.
- الگوی 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فقط یک آرنج مطابقت یافته اجرا میشود. - قانون جایگزینی خودکار وجود ندارد.
- آرنج
_فقط یک بار مجاز به استفاده است. - عدم وجود آرنج
_از نظر قانونی مشمول است (اگر آرنج مطابقت یافتهای وجود نداشته باشد هیچ آغازی اجرا نمیشود)
موارد مورد توجه
- ممنوعیت تکرار کیسها
- اعلان کیس تکراری یک خطای کامپایل را ایجاد میکند.
- ممنوعیت تکرار
_
- آر نج
_نمیتواند بیش از یک بار اعلام شود.
- ضرورت بلوک آرنج
- بعد از
=>باید یک بلوک باند{ ... }نوشته شود.
- الگو باید یک عدد صحیح باشد
- الگوی اسم باید فقط برای اعداد صحیح/بیتهای variant enum قابل تفسیر باشد.
خلاصه
match در Wave یک عبارت برای تقسیم بهینه اعداد صحیح/enum است.
با استفاده از ساختار => + بلوک، و wildcard(_) میتوان یک تقسیم پایه را تشکیل داد.
هرچه موارد تقسیم بیشتر شود، خواندن if / else if آسانتر است و میتواند مقاصد را به وضوح بیان کند.
