2016-04-03 13 views
12

Diverse volte ho usato la sintassi sbagliata, come dimenticare di utilizzare let in questo esempio:Che cos'è l'attribuzione del tipo?

let closure_annotated = |value: i32| -> i32 { 
    temp: i32 = fun(5i32); //<-- Error 
    temp + value + 1 
}; 
error: type ascription is experimental (see issue #23416) 
      temp: i32 = fun(5i32); //<-- Error 
      ^~~~~~~~~ 

So che questo problema è risolto utilizzando let, ma qualcuno può spiegare che cosa "tipo attribuzione "è e che uso ha?

Ho trovato issue #23416 e the feature gate for type ascription, ma non sono riuscito a trovare nulla per capire che cosa sia "l'ascrizione" e qual è il suo scopo.

risposta

22

L'attribuzione di tipo è la possibilità di annotare un'espressione con il tipo che vogliamo che abbia. Digitare l'attribuzione in Rust è descritto in RFC 803.

In alcune situazioni, il tipo di un'espressione può essere ambiguo. Ad esempio, questo codice:

fn main() { 
    println!("{:?}", "hello".chars().collect()); 
} 

dà il seguente errore:

<anon>:2:38: 2:47 error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [E0282] 
<anon>:2  println!("{:?}", "hello".chars().collect()); 
               ^~~~~~~~~ 

Ecco perché il metodo collect può restituire qualsiasi tipo che implementa il tratto FromIterator per il tipo di iteratore Item. Con il tipo di attribuzione, si potrebbe scrivere:

fn main() { 
    println!("{:?}", "hello".chars().collect(): Vec<char>); 
} 

Invece della corrente (come di Rust 1.7) modi di disambiguazione questa espressione:

fn main() { 
    println!("{:?}", "hello".chars().collect::<Vec<char>>()); 
} 

o:

fn main() { 
    let vec: Vec<char> = "hello".chars().collect(); 
    println!("{:?}", vec); 
} 
+0

vi ringrazio molto per la spiegazione e il collegamento –

+1

Un esempio ancora * migliore * è 'Into'; poiché il parametro type contiene un parametro di * trait *, è * impossibile * annotare una chiamata al metodo '.into()' per specificare il tipo. È necessario riscrivere l'espressione per utilizzare invece una chiamata di funzione annotata. –

+0

'Questo perché il metodo collect può restituire qualsiasi tipo che implementa il FromIterator' - ma perché restituirebbe qualcosa di diverso dal tipo di" chars() "? –