我正在查看nom机箱是否生锈,它包含许多解析字节/字符的函数。
许多函数(如下面所示的tag() )进程输入不是作为函数的参数提供的,而是出现在第二组括号中,在我称之为参数之后。例如,如果在干草堆中查找针,那么tag()函数使用自己的参数,这是如何指定指针的,但是干草堆是单独指定的,在参数括号之后,在自己的括号内(可能是因为它是单个值元组?)。
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()的呢?
有人能给我解释一下这个语法吗,或者告诉我在哪里读到它。它有效,我可以用它,但我不明白我在看什么!
谢谢
发布于 2021-01-25 12:55:08
tag()的返回值为impl Fn(Input) -> IResult<Input, Input, Error>,即该函数返回另一个函数。第一组括号用于调用tag();第二组用于调用它返回的函数。
这允许您将这些函数返回的“解析器”存储在变量中,并多次使用它。或者,用不同的方式来代替问题中的函数定义,您也可以编写
let parser = tag("Hello");然后以调用函数的方式调用parser。
发布于 2021-01-25 13:02:10
tag("Hello")只返回一个函数,然后使用参数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
}https://stackoverflow.com/questions/65885127
复制相似问题