Rust自定义parse_u64宏调用expect报类型不匹配错误如何解决
问题原因
Result::expect方法要求传入的错误提示参数类型为&str,你宏代码中直接将format!返回的String类型值传给expect,触发了类型不匹配错误。
你手动书写的原始代码中expect的入参是静态字符串字面量,本身就是&'static str类型,符合方法要求,因此不会报错。
修复方案
有两种可行修复方式:
方案1:简单适配类型(运行时生成提示信息)
给format!返回的String添加借用符&,Rust会自动将&String解引用为expect要求的&str类型:
macro_rules! parse_u64 { ($var:ident) => { Some( $var .as_ref() .parse::<u64>() .expect(&format!("'{:?}' should be an unsigned integer", stringify!($var))) ) }; }
方案2:编译期拼接提示信息(更优,无运行时开销)
因为提示信息的所有内容都是编译期可确定的静态字符串,可以用concat!宏替代format!,直接在编译期拼接出符合要求的&'static str类型提示信息,不需要运行时内存分配:
macro_rules! parse_u64 { ($var:ident) => { Some( $var .as_ref() .parse::<u64>() .expect(concat!("'", stringify!($var), "' should be an unsigned integer")) ) }; }
内容的提问来源于stack exchange,提问作者Evan Carroll
相关产品推荐
相关产品推荐

