Почему преобразование CompleteStr Nom в строку в макросе с именем!вернуть результат? - PullRequest
0 голосов
/ 27 ноября 2018

Когда я пытаюсь преобразовать ном 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 Ответ

0 голосов
/ 27 ноября 2018

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)
       )
);
...