Match guards og bindings
Tilføj betingelser, og indfang værdier.
Match guards og bindings er en gratis Lær at programmere i Rust-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lær at programmere i Rust, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lær at programmere i Rust-kurset indeholder 4 lektioner i alt.
Hvad er en match-guard
En match-guard er en ekstra if-betingelse, der føjes til en match-arm. Armen aktiveres kun, når mønsteret matcher og betingelsen er sand.
Det gør det muligt at opdele én variant i mere specifikke cases baseret på dens data.
match number {
Some(n) if n > 0 => println!("positive"),
Some(n) => println!("zero or negative"),
None => println!("no number"),
}Guard-syntaks
Skriv mønsteret, derefter if condition og så =>. Betingelsen kan bruge alle variabler, som mønsteret bandt.
Hvis guarden er falsk, går Rust videre og prøver den næste arm.
fn main() {
let n = 4;
match n {
x if x % 2 == 0 => println!("even"),
_ => println!("odd"),
}
}Guards med enum-data
Guards er mest nyttige med enums, der indeholder data. Du binder den indre værdi og tester den derefter.
Her får en positiv saldo og en negativ saldo forskellige beskeder, selvom de begge er den samme variant.
enum Account {
Balance(i32),
Closed,
}
fn main() {
let a = Account::Balance(-5);
match a {
Account::Balance(b) if b < 0 => println!("overdrawn"),
Account::Balance(b) => println!("balance {}", b),
Account::Closed => println!("closed"),
}
}Rækkefølgen er stadig vigtig
Fordi armene afprøves oppefra og ned, skal du placere den mest specifikke arm med guard før den generelle.
Hvis den almindelige Balance(b)-arm stod først, ville den matche alt, og armen med guard ville aldrig blive kørt.
Match på bogstavelige værdier
Du kan også matche direkte på bestemte literaler i mønsteret uden en guard.
Her matches 0 og 1 nøjagtigt, mens _ håndterer resten.
fn main() {
let n = 1;
match n {
0 => println!("zero"),
1 => println!("one"),
_ => println!("many"),
}
}Match på intervaller
Mønstre kan matche et interval af værdier med ..=, som inkluderer begge endepunkter.
Det er et enkelt alternativ til flere sammenligningsguards.
fn main() {
let score = 85;
match score {
0..=59 => println!("fail"),
60..=100 => println!("pass"),
_ => println!("out of range"),
}
}Binding med @-operatoren
Operatoren @ lader dig teste en værdi mod et mønster og binde den til et navn på samme tid.
Her tjekker id @ 1..=5 intervallet og gemmer den faktiske værdi i id, så du kan udskrive den.
fn main() {
let n = 3;
match n {
id @ 1..=5 => println!("small id {}", id),
other => println!("other {}", other),
}
}Binding af hele værdien
Et almindeligt navn i et mønster, som other ovenfor, binder hele værdien. Det fungerer som en catch-all, som du stadig kan bruge.
Brug _, når du vil ignorere værdien, og et navn, når du har brug for den.
fn main() {
let n = 99;
match n {
0 => println!("zero"),
value => println!("got {}", value),
}
}Guards og bindinger sammen
Du kan kombinere en binding med en guard for at få præcis kontrol: bind dataene, og tilføj derefter en betingelse.
Dette program markerer store lige saldi på en særlig måde.
enum Account {
Balance(i32),
}
fn main() {
let a = Account::Balance(200);
match a {
Account::Balance(b) if b > 100 && b % 2 == 0 => println!("big even {}", b),
Account::Balance(b) => println!("normal {}", b),
}
}Guards over flere mønstre
En guard gælder for hele armen, også når armen kombinerer mønstre med |.
Betingelsen kontrolleres, efter at et af de angivne mønstre matcher.
fn main() {
let n = 6;
match n {
2 | 4 | 6 if n > 3 => println!("big even"),
_ => println!("other"),
}
}Sæt det hele sammen
Dette sidste program kombinerer varianter med data, en binding, en guard og en catch-all for at klassificere en temperaturaflæsning.
Ændr værdien, og kør programmet igen for at se forskellige arme blive aktiveret.
enum Reading {
Temp(i32),
Missing,
}
fn main() {
let r = Reading::Temp(38);
match r {
Reading::Temp(t) if t >= 38 => println!("fever: {}", t),
Reading::Temp(t) => println!("normal: {}", t),
Reading::Missing => println!("no reading"),
}
}Hurtigt tjek
Tjek, om du har forstået guards og bindinger.
Opsummering
Du har lært at gøre matches mere præcise med guards (pattern if condition), matche literaler og intervaller (..=) og oprette bindinger med navne eller operatoren @.
Sammen med alt det foregående kan du nu modellere faste sæt af tilstande, knytte data til dem og reagere præcist på hver case. Flot arbejde med enums og match!
Lær Rust med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 39
- Lektioner
- 144
Ofte stillede spørgsmål
Er lektionen “Match guards og bindings” gratis?
Ja — alle 3 lektioner i læringssporet Lær at programmere i Rust, inklusive “Match guards og bindings”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lær at programmere i Rust-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Match guards og bindings”?
Tilføj betingelser, og indfang værdier. Du øver dig i Lær at programmere i Rust med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Lær at programmere i Rust?
Der kræves ingen tidligere erfaring. Lær at programmere i Rust på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Match guards og bindings”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Lær at programmere i Rust-lektion?
Ja. Alle Lær at programmere i Rust-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Definér Deres første enum
- Match på enum-varianter
- Enums med data
- Match guards og bindings