首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生锈函数语法问题,示例出现在nom中。

生锈函数语法问题,示例出现在nom中。
EN

Stack Overflow用户
提问于 2021-01-25 12:50:27
回答 2查看 191关注 0票数 1

我正在查看nom机箱是否生锈,它包含许多解析字节/字符的函数。

许多函数(如下面所示的tag() )进程输入不是作为函数的参数提供的,而是出现在第二组括号中,在我称之为参数之后。例如,如果在干草堆中查找针,那么tag()函数使用自己的参数,这是如何指定指针的,但是干草堆是单独指定的,在参数括号之后,在自己的括号内(可能是因为它是单个值元组?)。

代码语言:javascript
复制
use nom::bytes::complete::tag;

fn parser(s: &str) -> IResult<&str, &str> {
  tag("Hello")(s)
}

在上面的例子中,tag()的工作是测试输入s是否以Hello开头。您可以调用parser,传入"Hello!“,tag()函数确实可以验证s的开头是Hello。但是(s)是如何进入tag()的呢?

有人能给我解释一下这个语法吗,或者告诉我在哪里读到它。它有效,我可以用它,但我不明白我在看什么!

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-25 12:55:08

tag()的返回值为impl Fn(Input) -> IResult<Input, Input, Error>,即该函数返回另一个函数。第一组括号用于调用tag();第二组用于调用它返回的函数。

这允许您将这些函数返回的“解析器”存储在变量中,并多次使用它。或者,用不同的方式来代替问题中的函数定义,您也可以编写

代码语言:javascript
复制
let parser = tag("Hello");

然后以调用函数的方式调用parser

票数 2
EN

Stack Overflow用户

发布于 2021-01-25 13:02:10

tag("Hello")只返回一个函数,然后使用参数s (即tag("Hello")(s) )立即调用该函数。下面是一个简单的实现示例:

代码语言:javascript
复制
fn tag<'a>(needle: &'a str) -> impl Fn(&str) -> bool + 'a {
    move |haystack: &str| haystack.starts_with(needle)
}

fn parser(s: &str) -> bool {
    tag("Hello")(s)
}

fn main() {
    println!("{}", parser("Hello everbody!")); // true
    println!("{}", parser("Bye everybody!")); // false
}

游乐场

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65885127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档