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
}
我正在查看 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
}