Ecco un testcase semplice, che funziona ancora sul playpen:"prova!" macro smesso di funzionare dopo Rust aggiornamento
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()));
}
Tuttavia, dopo che ho costruito l'ultimo rustc da Git (ora è rustc 1.1.0-dev (1114fcd94 2015-04-23)
), si è fermato compilazione con seguente errore :
<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
Non riesco a scoprire cosa c'è che non va. Perché il compilatore non è in grado di trovare la mia implementazione del tratto?
Provare a chiamare direttamente 'std :: convert :: From :: from' (ad esempio espandendo efficacemente la macro) per diagnosticare? 'match s.parse() {Ok (f) => Ok (f), Err (e) => return Err (From :: from (e))}'. – huon
Sì - il messaggio di errore è lo stesso, ma il puntatore della linea rossa si trova ora in "Da :: da". – swizard
Ho appena provato lo stesso codice con il tipo 'u64' e l'errore' ParseIntError' - funziona! Quindi sembra che il mio problema sia legato solo a 'ParseFloatError'. – swizard