我对nom
7.1 版进行了这个测试:
use nom::bytes::complete::tag;
#[test]
fn test() {
let (s, t) = tag("1")("123").unwrap();
}
运行cargo test
给
error[E0283]: type annotations needed
--> src/main.rs:5:18
|
5 | let (s, t) = tag("1")("123").unwrap();
| ^^^ cannot infer type for type parameter `Error` declared on the function `tag`
|
= note: cannot satisfy `_: ParseError<&str>`
note: required by a bound in `nom::bytes::complete::tag`
--> ~/.cargo/registry/src/github.com-1ecc6299db9ec823/nom-7.1.0/src/bytes/complete.rs:32:29
|
32 | pub fn tag<T, Input, Error: ParseError<Input>>(
| ^^^^^^^^^^^^^^^^^ required by this bound in `nom::bytes::complete::tag`
help: consider specifying the type arguments in the function call
|
5 | let (s, t) = tag::<T, Input, Error>("1")("123").unwrap();
| +++++++++++++++++++
它建议我指定tag::<T, Input, Error>()
我该如何处理?我还没有完全理解为什么会出现这个问题。
我尝试从以下指定一些类型nom
:
use nom::bytes::complete::tag;
#[test]
fn test() {
let (s, t) = (tag::<_, &str, nom::error::ParseError<&str>>("1")("123")).unwrap();
}
error[E0782]: trait objects must include the `dyn` keyword
--> src/main.rs:5:34
|
5 | let (s, t) = (tag::<_, &str, nom::error::ParseError<&str>>("1")("123")).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: add `dyn` keyword before this trait
|
5 | let (s, t) = (tag::<_, &str, dyn nom::error::ParseError<&str>>("1")("123")).unwrap();
| +++
error[E0277]: the size for values of type `dyn ParseError<&str>` cannot be known at compilation time
--> src/main.rs:5:19
|
5 | let (s, t) = (tag::<_, &str, nom::error::ParseError<&str>>("1")("123")).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `dyn ParseError<&str>`
note: required by a bound in `nom::bytes::complete::tag`
--> ~/.cargo/registry/src/github.com-1ecc6299db9ec823/nom-7.1.0/src/bytes/complete.rs:32:22
|
32 | pub fn tag<T, Input, Error: ParseError<Input>>(
| ^^^^^ required by this bound in `nom::bytes::complete::tag`
error[E0038]: the trait `ParseError` cannot be made into an object
--> src/main.rs:5:34
|
5 | let (s, t) = (tag::<_, &str, nom::error::ParseError<&str>>("1")("123")).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `ParseError` cannot be made into an object
|
= note: the trait cannot be made into an object because it requires `Self: Sized`
= note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>