2015-04-23 13 views
5

Đây là một testcase đơn giản, mà vẫn còn hoạt động trên playpen:"thử!" vĩ mô ngừng làm việc sau khi Rust nâng cấp

use std::num; 
use std::str::FromStr; 
use std::convert::From; 

#[derive(Debug)] 
struct Error(String); 

impl From<num::ParseFloatError> for Error { 
    fn from(err: num::ParseFloatError) -> Error { 
     Error(format!("{}", err)) 
    } 
} 

fn parse(s: &String) -> Result<f64, Error> { 
    Ok(try!(<f64 as FromStr>::from_str(&s[..]))) 
} 

fn main() { 
    println!("{:?}", parse(&"10.01".to_string())); 
} 

Tuy nhiên, sau khi tôi đã xây dựng rustc mới nhất từ ​​git (bây giờ nó rustc 1.1.0-dev (1114fcd94 2015-04-23)), nó dừng lại biên soạn với lỗi sau :

<std macros>:6:1: 6:32 error: the trait `core::convert::From<core::num::ParseFloatError>` is not implemented for the type `Error` [E0277] 
<std macros>:6 $ crate:: convert:: From:: from (err)) } }) 
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
<std macros>:1:1: 6:48 note: in expansion of try! 
exp.rs:15:8: 15:48 note: expansion site 
error: aborting due to previous error 

Tôi không thể tìm ra điều gì sai. Tại sao trình biên dịch không thể tìm thấy thực hiện đặc điểm của tôi?

+0

Bạn có thể thử gọi trực tiếp từ «std :: convert :: From :: from' (nghĩa là mở rộng macro) để giúp chẩn đoán không? 'match s.parse() {Ok (f) => Ok (f), Err (e) => trả về Err (Từ :: từ (e))}'. – huon

+0

Có - thông báo lỗi là giống nhau, nhưng con trỏ dòng màu đỏ bây giờ là dưới 'Từ :: từ'. – swizard

+0

Tôi vừa thử cùng một mã với lỗi 'u64' và' ParseIntError' - nó hoạt động! Vì vậy, có vẻ như vấn đề của tôi chỉ liên quan đến 'ParseFloatError'. – swizard

Trả lời

4

này có vẻ như nó là một lỗi: std::num::ParseFloatError<f64 as FromStr>::Err nhiều loại khác nhau:

impl From<num::ParseFloatError> for Error đang sử dụng cái sau, trong khi <f64 as FromStr>::from_str(...) sẽ trả về giá trị cũ.

Tôi đã mở #24748 về việc đó. Tôi cũng đã mở #24747 về cải thiện chẩn đoán để làm cho việc gỡ lỗi này dễ dàng hơn trong tương lai.

Người ta có thể giải quyết vấn đề này bằng cách thay thế việc triển khai đặc điểm cho core::num::ParseFloatError. Bạn sẽ cần phải tải thùng core với extern crate core; và sẽ cần một số cổng tính năng.

+0

Cảm ơn bạn đã điều tra! Có lẽ bạn có thể đề xuất một số cách giải quyết tạm thời (ngoại trừ việc hạ cấp gỉ)? Có vẻ như không có cách nào để thực hiện 'Từ ' cho 'Lỗi'. – swizard

+0

Bạn có thể cụ thể hơn về ý nghĩa của "không có cách nào" không? (Tôi đã chỉnh sửa một đoạn với một công việc xung quanh vào cuối câu trả lời của tôi.) – huon

+0

Ồ, xin lỗi, điều đó chắc chắn hoạt động. Tôi không tải thùng 'lõi'. – swizard

Các vấn đề liên quan