In questo caso, è possibile associare con riferimento:
let res = match Some("hi".to_string()) {
Some(ref s) if s.len() == 0 => 1,
_ => 3
};
Il problema generale è che il legame con mossa deve impedire ulteriori utilizzi della variabile originale, come uscendo invalida i dati. Se la protezione è false
, è necessario utilizzare la variabile originale per confrontarla con i modelli successivi, che è illegale a causa dello spostamento.
Ad esempio:
fn f(x: Option<String>) {
match x {
Some(a) if { drop(a); false } => println!("impossible"),
Some(b) => println!("whoops, {}", b),
None => println!("none"),
}
}
Se x
è Some
, l'interno String
viene spostato fuori e deallocato quando si decide se a
braccio deve essere preso, ma lo stesso String
viene immediatamente utilizzata ancora per il braccio b
volta la Il braccio a
viene rifiutato.
Quindi, in pratica, quello che dice il compilatore è "Ehi, sono felice di passare 'e' alla dichiarazione di sicurezza, ma se la dichiarazione di sicurezza fallisce, non c'è modo che io possa spostarmi indietro. E quindi l'unico modo questo funzionerà se mi lasci prendere in prestito 'e' per controllare la dichiarazione di guardia. " –
Cosa succede se non ho bisogno della proprietà nell'espressione guardia, ma nel corpo? – Thayne