我正在寻找 rust 的nom
crate ,其中包含许多解析字节/字符的功能。
许多函数(例如tag()
,如下所示)处理的输入不是作为函数的参数提供的,而是在我称之为参数的第二组括号中显示的。例如,如果在大海捞针中寻找一根针,那么tag()
函数将使用其自己的参数,这是一种指定针的方式,但是在参数括号后在其自己的括号内分别指定了干草堆(也许是因为它是单个值元组?)。
use nom::bytes::complete::tag;
fn parser(s: &str) -> IResult<&str, &str> {
tag("Hello")(s)
}
在上面的示例中,tag()
的工作是测试输入的s
是否以Hello
开头。您可以调用parser
,传入“大家好!”,并且tag()
函数确实可以验证s
的开头是Hello。但是(s)
是如何进入tag()
的呢?有人可以向我解释此语法,或显示在何处阅读该语法。它有效,我可以使用它,但是我不明白我在看什么!
谢谢
最佳答案
tag()
的返回值为impl Fn(Input) -> IResult<Input, Input, Error>
,即该函数返回另一个函数。第一组括号用于调用tag()
;第二组用于调用它返回的函数。
这使您可以将这些函数返回的“解析器”存储在变量中,并多次使用。或者,换句话说,您也可以编写代替问题中的函数定义的代码
let parser = tag("Hello");
然后以与调用该函数相同的方式调用parser
。
关于rust - Rust函数语法问题,示例出现在nom中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65885127/