2015-04-27 11 views

risposta

13

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.

+2

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. " –

+1

Cosa succede se non ho bisogno della proprietà nell'espressione guardia, ma nel corpo? – Thayne

Problemi correlati