为什么将 nom 的 CompleteStr 转换为 named! 宏中的字符串? return 有结果?
Why does converting a nom’s CompleteStr to a String in the macro named! return a Result?
当我尝试将 nom 的 CompleteStr
转换为 named!
中的 String
时,我收到一条错误消息,指出它正在返回 Result
。
named!(letter_cs<CompleteStr,String>,
map_res!(
alpha,
|CompleteStr(s)| String::from(s)
)
);
会抛出错误
error[E0308]: mismatched types
--> src/year2015/day_7.rs:16:1
|
16 | / named!(letter_cs<CompleteStr,String>,
17 | | map_res!(
18 | | alpha,
19 | | |CompleteStr(s)| String::from(s)
20 | | )
21 | | );
| |__^ expected struct `std::string::String`, found enum `std::result::Result`
|
= note: expected type `std::string::String`
found type `std::result::Result<_, _>`
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
map_res!
期望一个函数 return 是一个 Result
作为第二个参数,这就是 map_res!
被这样命名的原因。您还可以在 nom 的文档中的 "type" 中看到它:
map_res!(I -> IResult<I,O>, O -> Result<P>) => I -> IResult<I, P>
但是,String::from
没有 return 结果;所以 String::from(s)
是 map_res!
的错误类型。相反,您应该使用常规的 map!
,它具有 "type" map!(I -> IResult<I,O>, O -> P) => I -> IResult<I, P>
:
#[macro_use]
extern crate nom;
use nom::types::CompleteStr;
use nom::alpha;
named!(letter_cs<CompleteStr,String>,
map!(
alpha,
|CompleteStr(s)| String::from(s)
)
);
当我尝试将 nom 的 CompleteStr
转换为 named!
中的 String
时,我收到一条错误消息,指出它正在返回 Result
。
named!(letter_cs<CompleteStr,String>,
map_res!(
alpha,
|CompleteStr(s)| String::from(s)
)
);
会抛出错误
error[E0308]: mismatched types
--> src/year2015/day_7.rs:16:1
|
16 | / named!(letter_cs<CompleteStr,String>,
17 | | map_res!(
18 | | alpha,
19 | | |CompleteStr(s)| String::from(s)
20 | | )
21 | | );
| |__^ expected struct `std::string::String`, found enum `std::result::Result`
|
= note: expected type `std::string::String`
found type `std::result::Result<_, _>`
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
map_res!
期望一个函数 return 是一个 Result
作为第二个参数,这就是 map_res!
被这样命名的原因。您还可以在 nom 的文档中的 "type" 中看到它:
map_res!(I -> IResult<I,O>, O -> Result<P>) => I -> IResult<I, P>
但是,String::from
没有 return 结果;所以 String::from(s)
是 map_res!
的错误类型。相反,您应该使用常规的 map!
,它具有 "type" map!(I -> IResult<I,O>, O -> P) => I -> IResult<I, P>
:
#[macro_use]
extern crate nom;
use nom::types::CompleteStr;
use nom::alpha;
named!(letter_cs<CompleteStr,String>,
map!(
alpha,
|CompleteStr(s)| String::from(s)
)
);