枚举派生调试

时间:2015-07-03 08:55:04

标签: rust

以下代码编译(特别是MyError被识别为具有特征调试):

use std::str;
use std::fmt;

#[derive(Debug)]
enum MyError<F> where F: str::FromStr {
    Parse(F::Err),
    Space,
}

fn my_parse<F>(s: String) -> Result<F,MyError<F>>
    where F: str::FromStr {
    match s.len() {
        0 => Err(MyError::Space),
        _ => s.parse::<F>().map_err(|err| MyError::Parse(err)),
    }
}

fn my_force_parse<F>(s: String) -> F
    where F: str::FromStr, MyError<F>: fmt::Debug {
    my_parse::<F>(s).unwrap()
}

fn main() {
    println!("hi");
    let s = "nope".to_string();
    println!("{}", my_force_parse::<i64>(s));
}

但是如果我用

替换my_force_parse的where语句
where F: str::FromStr

然后它没有。程序是否应该从#[derive(Debug)]属性中收集MyError实现Debug?

1 个答案:

答案 0 :(得分:2)

MyError 无法无条件地实施Debug ... 。相反,只要所有必需的通用参数实现它,它就会实现它。实质上,#[derive(Debug)]属性扩展为大致类似于:

impl<F> MyError<F> where F: Debug {
    ...
}

毕竟,如果F未实现Debug,则MyError无法提供实施。

此外,好像where F: str::FromStr + fmt::Debug似乎还不够。据推测,Rust要么不够聪明才能意识到F: DebugMyError<F>: Debug,否则就会出现问题。