Kenyataan perlawanan
pengenalan
Pernyataan match ialah pernyataan kawalan yang membandingkan satu nilai dengan berbilang corak dan cawangan.
Ini berguna untuk menyatakan niat cawangan dengan lebih jelas daripada rantai if / else if.
Pada masa ini, match daripada Wave ialah penyataan dan bentuk ungkapan yang dinilai secara langsung sebagai nilai tidak disokong.
Iaitu, borang seperti var x = match (...) { ... } tidak boleh digunakan.
tatabahasa asas
match (value) {
pattern1 => {
// blok pelaksanaan
}
pattern2 => {
// blok pelaksanaan
}
_ => {
// blok lalai
}
}
Peraturan tatabahasa:
- Pengepala menggunakan format
match (expr). - Setiap lengan menggunakan format
pattern => { block }. - Badan lengan mestilah blok
{ ... }. - Anda hanya boleh menggunakan pemisah baris antara lengan, atau anda boleh menggunakan
,atau;sebagai pemisah.
jenis corak
Terdapat tiga corak yang disokong pada masa ini di bawah.
- corak literal integer
0 => { ... }
1 => { ... }
42 => { ... }
- corak pengecam
Off => { ... }
On => { ... }
Corak pengecam menggunakan nilai yang boleh ditafsirkan sebagai pemalar integer seperti varian enum.
- Corak kad liar (
_)
_ => { ... }
Ini ialah lengan lalai yang dilaksanakan apabila tiada corak dipadankan.
Memadankan jenis sasaran
Setakat pelaksanaan semasa, nilai sasaran match mestilah siri integer/enum.
Rentetan, nombor titik terapung, struktur, dsb. tidak boleh digunakan sebagai sasaran match.
Contoh 1: Cawangan integer
fun classify_num(v: i32) -> i32 {
var result: i32 = -1;
match (v) {
0 => {
result = 10;
}
1 => {
result = 20;
}
_ => {
result = 99;
}
}
return result;
}
Contoh 2: percabangan 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;
}
}
}
Peraturan Tingkah Laku
- Sama seperti keluarga
switch, hanya satu lengan yang sepadan akan berjalan. - Tiada kegagalan automatik.
- Lengan
_boleh digunakan paling banyak sekali. _Walaupun tanpa lengan, ia dibenarkan secara tatabahasa. (Jika tiada lengan yang sepadan, tiada lengan akan dilaksanakan)
Langkah berjaga-jaga
- Tiada kes pendua
- Pengisytiharan pendua bagi kes yang sama akan mengakibatkan ralat penyusunan.
_Tiada pertindihan
- Lengan
_tidak boleh diisytiharkan lebih daripada sekali.
- blok lengan diperlukan
- Anda mesti menggunakan blok
=>selepas{ ... }.
- Corak mestilah malar
- Untuk corak pengecam, hanya gunakan nilai yang boleh ditafsirkan sebagai pemalar integer/varian enum.
ringkasan
match daripada Wave ialah pernyataan kawalan pernyataan yang dioptimumkan untuk percabangan integer/enum.
Ia menggunakan struktur blok => + dan boleh mengkonfigurasi cawangan lalai melalui kad bebas (_).
Lebih banyak kes bercabang, lebih mudah dibaca daripada if / else if dan lebih jelas ia mendedahkan maksudnya.
