以下代码编译(特别是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?
最佳答案 MyError无法无条件地实现Debug.相反,只要所有必需的通用参数也实现它,它就会实现它.实质上,#[derive(Debug)]属性扩展为大致类似于:
impl<F> MyError<F> where F: Debug {
...
}
毕竟,如果F没有实现Debug,MyError就无法提供实现.
此外,似乎F:str :: FromStr fmt :: Debug的位置也不够.据推测,Rust要么不够聪明才能意识到F:Debug⇒MyError< F>:Debug,或者假设存在问题.