2015-04-23 10 views
5

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?

+0

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

+0

Sì - il messaggio di errore è lo stesso, ma il puntatore della linea rossa si trova ora in "Da :: da". – swizard

+0

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

risposta

4

Questo appare come si tratta di un bug: std::num::ParseFloatError e <f64 as FromStr>::Err sono diversi tipi:

Il impl From<num::ParseFloatError> for Error utilizza quest'ultimo, mentre <f64 as FromStr>::from_str(...) restituisce il primo.

Ho aperto #24748 su di esso. Ho anche aperto #24747 sul miglioramento della diagnostica per rendere più facile il debug in futuro.

Uno può aggirare questo implementando invece il tratto per core::num::ParseFloatError. Avrai bisogno di caricare la cassa core con extern crate core; e avrà bisogno di alcune porte di funzionalità.

+0

Grazie per le indagini! Forse potresti suggerire qualche soluzione temporanea (eccetto il downgrade della ruggine)? Sembra che non ci siano modi per implementare 'Da ' per 'Errore'. – swizard

+0

Potresti essere più specifico su cosa intendi con "nessun modo"? (Ho modificato un paragrafo con un aggiramento nella parte finale della mia risposta.) – huon

+0

Oh, scusate, questo sicuramente funziona. Non ho caricato la cassa 'core'. – swizard

Problemi correlati