2015-07-03 10 views
13

Rozważmy następujący kod:PI stała jest niejednoznaczna

fn main() { 
    let i = f32::consts::PI; 
} 

z następującym błędem:

$ rustc --version 
rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14) 
$ rustc - 
<anon>:2:13: 2:28 error: ambiguous associated type; specify the type using the syntax `<f32 as Trait>::consts` [E0223] 
<anon>:2  let i = f32::consts::PI; 
        ^~~~~~~~~~~~~~~ 
error: aborting due to previous error 
  1. Dlaczego narzekać na "wiązanego typu"? Jedyny typ, jaki widzę tutaj, to f32, który nie jest powiązany.
  2. Dlaczego jest to jednoznaczne? Wyraźnie określiłem numer f32.
  3. Co to jest składnia <f32 as Trait>::consts? Nigdy wcześniej tego nie widziałem.
  4. I, oczywiście, co mogę zrobić, aby naprawić ten błąd i ustawić zmienną na PI?
+2

błąd jest zaskakujący (i jest to błąd IMHO). Aby kod zadziałał, możesz podać 'std :: f32 :: consts :: PI' lub dodać użycie' std :: f32' –

+0

Działa, dzięki! To rozwiązuje czwarte pytanie, a może nawet 1 i 2, jeśli naprawdę jest to błąd (który wygląda) – Kapichu

+0

Zgłosiłem to jako problem https://github.com/rust-lang/rust/issues/26760, więc poszukiwacz Rusta może w to zaglądać. –

Odpowiedz

7

Aby rozwiązać ten problem, należy dodać use std::f32 lub użyj std::f32::consts::PI, więc kompilator wie, że mówimy o modulef32tutaj, a nie typf32.

+3

To jest naprawdę zły projekt, jeśli moduł 'f32' i typ' f32' konfliktują ** domyślnie **, chociaż jest to nawet zabronione w Rust! – Kapichu

3

What is this <f32 as Trait>::consts syntax? I've never seen it before.

ta jest obecnie nazywany „uniwersalnym wywołanie funkcji składnia” http://doc.rust-lang.org/stable/book/ufcs.html, ale mówimy, że nie nazywając go już, ponieważ nie jest to funkcja ... to bardziej rozszerzonej, jednoznacznej formie.

Powiązane problemy