Почему преобразование CompleteStr Nom в строку в макросе с именем! вернуть результат?
Когда я пытаюсь конвертировать Nom's CompleteStr
к String
в named!
Я получаю сообщение об ошибке, сообщающее, что он возвращает 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)
1 ответ
Решение
map_res!
ожидает функцию, которая возвращает Result
в качестве второго аргумента, поэтому map_res!
назван так Вы также можете увидеть его в "type" в документе nom:
map_res!(I -> IResult<I,O>, O -> Result<P>) => I -> IResult<I, P>
Тем не мение, String::from
не возвращает результат; так String::from(s)
это неправильный тип для map_res!
, Вместо этого вы должны использовать обычный map!
, который имеет этот "тип" 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)
)
);