2016-08-09 14 views
1

In https://doc.rust-lang.org/book/primitive-types.html#numeric-types, sagt man, dass inHaben literale ganzzahlige Werte einen bestimmten Typ in Rust?

let x = 42; // hat x i32

Typ, der bedeutet x den Typ i32 als Standard hat.

Aber in http://rustbyexample.com/cast/literals.html, heißt es, dass

Unsuffixed wörtlichen, deren Typen davon abhängen, wie sie

verwendet werden, ich weiß, dass ich nicht i32 indizieren den Vektor verwenden, aber die folgende Code funktioniert:

fn main() { 
    let v = vec![1, 2, 3, 4, 5]; 

    let j = 1; // j has default type i32? or it has type when it is first used? 
       // And what is the type of 1? 

    println!("{}", v[1]); // is 1 a usize? 
    println!("{}", v[j]); 
} 

Also, was ist der Typ eines literalen Integralwerts?

+0

Siehe auch http://stackoverflow.com/q/32697884/155423 – Shepmaster

Antwort

5

Vom language reference:

Der Typ eines unsuffixed Ganzzahlliteral wird durch Typinferenz bestimmt:

  • Wenn ein Integer-Typ kann eindeutig aus dem umgebenden Programmkontext bestimmt werden, wobei die unsuffixed Integer-Literal hat diesen Typ.

  • Wenn der Programmkontext den Typ unterschreitet, wird standardmäßig die vorzeichenbehaftete 32-Bit-Ganzzahl i32 verwendet.

  • Wenn der Programmkontext den Typ zu stark einschränkt, wird dies als statischer Typfehler angesehen.

Auf der Linie

println!("{}", v[1]); // is 1 a usize? 

das umgebende Programmkontext 1 erfordert eine usize zu sein (denn das ist, was die [] Betreiber Bedürfnisse), also ja, hier 1 haben der Typ usize.

+0

Es ist auch erwähnenswert, dass der Typ nicht "das erste Mal, wenn es verwendet wird" abgeleitet wird. Wenn es in verschiedenen Kontexten verwendet wird, erhalten Sie einen Compilerfehler. Es wird einfach nicht in der Lage sein, den Typ zu bestimmen. – Keozon

Verwandte Themen