Rust 函数语法问题,示例似乎在名义上

Rust function syntax question, example seem in nom

我正在查看 nom rust 包,其中包含许多要解析的函数 bytes/characters。

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

use nom::bytes::complete::tag;

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

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

谁能给我解释一下这个语法,或者告诉我在哪里可以读到它。好用,我也能用,就是看不懂我在看什么!

谢谢

tag()的return值为impl Fn(Input) -> IResult<Input, Input, Error>,即函数return是另一个函数。第一组括号用于调用tag();第二组用于调用函数 returns.

这允许您将这些函数编辑的“解析器”return存储在一个变量中并多次使用它。或者,换句话说,您也可以写

而不是问题中的函数定义
let parser = tag("Hello");

然后像调用函数一样调用 parser

tag("Hello") 只是 returns 一个函数,然后立即用参数 s 调用它,即 tag("Hello")(s)。这是一个简单的实现示例:

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
}

playground