2015-07-03 18 views
13

Hãy xem xét đoạn mã sau:PI liên tục là mơ hồ

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

Với lỗi sau:

$ 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. Tại sao nó phàn nàn về một "loại liên quan đến"? Loại duy nhất tôi thấy ở đây là f32, không được liên kết.
  2. Tại sao điều này lại mang tính phi thường? Tôi đã chỉ định rõ ràng f32.
  3. Cú pháp <f32 as Trait>::consts này là gì? Tôi chưa bao giờ thấy nó trước đây.
  4. Và, hiển nhiên, tôi có thể làm gì để khắc phục lỗi này và đặt biến của tôi thành PI?
+2

lỗi là đáng ngạc nhiên (và là lỗi IMHO). Để làm cho mã hoạt động, bạn có thể chỉ định 'std :: f32 :: consts :: PI' hoặc thêm một sử dụng' std :: f32' –

+0

Nó hoạt động, cảm ơn! Điều này giải quyết các câu hỏi thứ tư và thậm chí có thể 1 và 2 họ nếu nó thực sự là một lỗi (mà nó trông giống như) – Kapichu

+0

Tôi báo cáo nó như là một vấn đề https://github.com/rust-lang/rust/issues/26760, vì vậy một Rust dev có thể nhìn vào nó. –

Trả lời

7

Để giải quyết vấn đề này, thêm use std::f32 hoặc sử dụng std::f32::consts::PI, do đó trình biên dịch biết chúng ta đang nói về mô-đunf32 đây, không phải là loạif32.

+3

Nó thực sự là thiết kế xấu nếu mô-đun 'f32' và loại' f32' xung đột ** theo mặc định **, mặc dù điều này thậm chí bị cấm trong Rust! – Kapichu

3

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

này hiện được gọi là "phổ quát cú pháp chức năng gọi là" http://doc.rust-lang.org/stable/book/ufcs.html, nhưng chúng ta đang nói về việc không gọi đó là thế nữa, vì đây không phải là một chức năng ... đó là nhiều hơn một mở rộng, hình thức rõ ràng.