Generics 如何包装一个nom标记\u no \u大小写解析器?

Generics 如何包装一个nom标记\u no \u大小写解析器?,generics,types,rust,closures,nom,Generics,Types,Rust,Closures,Nom,我想用特定的字符串值包装标记\u no\u case解析器,以便能够重复使用它们: pub fn schema_parser<???>(???) -> ??? { tag_no_case("schema") } 我试着复制标记no_案例打字和其他一些随机方法,但没有任何效果 类型声明应该如何使用如图所示的自定义解析器?返回一个impl-Fn(Input)->IResult,这意味着我们必须从包装函数返回类似的内容 为了简单和简洁,让我们跳过所有泛型

我想用特定的字符串值包装
标记\u no\u case
解析器,以便能够重复使用它们:

pub fn schema_parser<???>(???) -> ??? {
    tag_no_case("schema")
}
我试着复制
标记no_案例
打字和其他一些随机方法,但没有任何效果

类型声明应该如何使用如图所示的自定义解析器?

返回一个
impl-Fn(Input)->IResult
,这意味着我们必须从包装函数返回类似的内容

为了简单和简洁,让我们跳过所有泛型,只使用
&str
,此时编译器会抱怨返回的类型“不够通用”,因为它在整个生命周期内都不是泛型的。我们可以通过向函数签名添加生存期参数并使用该参数注释返回类型,将其限定为单个生存期

最终完整的工作和编译示例:

//nom=“6.1.0”
使用nom::{IResult,bytes::complete::tag_no_case,sequence::preferred};
fn模式\u解析器IResult{
标记号(无大小写)(“模式”)
}
fn main(){
让string=string::from(“exampleschema”);
让mut parser=前置(tag_no_case(“示例”),schema_parser();
assert_eq!(解析器(&string),Ok((“”,“schema”);//非静态str
assert_eq!(解析器(“exampleschema”)、Ok((“”,“schema”));/“static str”
}

做得很好。谢谢!
preceded(multispace0, schema_parser)(input)