2016-05-31 9 views
11

La ruggine esegue l'inferenza del tipo in situazioni abbastanza avanzate. Qualcuno potrebbe spiegare (o indicare) le regole che descrivono ciò che può e non può essere dedotto?Come funziona l'inferenza di tipo di Rust su più istruzioni?

Il primo è semplice: il tipo di legame è il tipo di espressione legata:

let n = 10u32; 

// Same as: 
// vvvvv 
let n: u32 = 10u32; 

Questo prossimo uno è più sorprendente per me: il parametro generico sulla destra si deduce dalla rilegatura digitare sulla sinistra:

let n: u32 = "10".parse().unwrap(); 

// same as:   vvvvvvv 
let n: u32 = "10".parse::<u32>().unwrap(); 

Questo funziona anche per "le funzioni di membro" di tipi generici:

let b = Box::new(10u32); 

// same as: 
//  vvvvv  vvvvvvv 
let b: Box<u32> = Box::<u32>::new(10u32); 

Ma la più strana di tutte è inferenza di tipo attraverso dichiarazioni:

let v = Vec::new(); // no type! 
v.push(10u32);  // apparently v is Vec<u32>?! 
// v.push(10i32);  // type error 

Quali sono le regole per l'inferenza dei tipi e il tipo di detrazione?

+0

Si basa su [Hindler-Milner] (https://en.wikipedia.org/wiki/Hindley%E2%80 % 93Milner_type_system). L'implementazione è spiegata in https://github.com/rust-lang/rust/blob/master/src/librustc/infer/README.md, ma è abbastanza obsoleto (ancora usando la sintassi precedente alla 1.0). – kennytm

+0

@kennytm: HM non ha una nozione di "dichiarazione", vero? In che modo questo spiega qualcosa come 'vec!'? –

+0

HM ha 'lascia x = e₁ in e₂'. – kennytm

risposta

Problemi correlati