我们如何能够将类型作为参数而不是turbofish传递给 syn::parse::ParseBuffer::peek
?
方法通常被称为 input.parse::<Token![;]>()
。我们将类型作为泛型传递,但 peek 期望它们为 input.peek(Token![;])
.
我想知道,因为如果我创建一个类型别名 Token![;]
喜欢 type TokenAlias = Token![;]
并像input.peek(TokenAlias)
一样使用它,
我收到错误:
expected value, found type alias `TokenAlias` can't use a type alias as a constructor
如果 Token![;]
那就有意义了也不被允许。
为什么当我使用类型别名时会出现此错误?
代码为TokenAlias
:
// COMPILE ERROR: expected value, found type alias `TokenAlias` can't use a type alias as a constructor
type TokenAlias = Token![;];
impl Parse for PathSegments {
fn parse(input: ParseStream) -> Result<Self> {
let mut segments = Punctuated::new();
let first = parse_until(input, TokenAlias)?;
segments.push_value(syn::parse2(first)?);
while input.peek(TokenAlias) {
segments.push_punct(input.parse()?);
let next = parse_until(input, TokenAlias)?;
segments.push_value(syn::parse2(next)?);
}
Ok(PathSegments { segments })
}
}
代码为Token![;]
:
// BUILDS SUCCESSFULLY
impl Parse for PathSegments {
fn parse(input: ParseStream) -> Result<Self> {
let mut segments = Punctuated::new();
let first = parse_until(input, Token![;])?;
segments.push_value(syn::parse2(first)?);
while input.peek(Token![;]) {
segments.push_punct(input.parse()?);
let next = parse_until(input, Token![;])?;
segments.push_value(syn::parse2(next)?);
}
Ok(PathSegments { segments })
}
}
以下是peek
的源代码来自syn
:
pub fn peek<T: Peek>(&self, token: T) -> bool {
let _ = token;
T::Token::peek(self.cursor())
}
最佳答案
peek
函数接受标记值,而不是类型。
接受的原因Token[;]
是它扩展为一个标识符,即名称 a type ,同时也是 global function对文档隐藏!您的类型别名引用该类型,并且尝试使用类似单元的结构的构造函数语法构造一个值,会使编译器提示此类语法不适用于类型别名。 (即使确实如此, Semi
也不是一个类似单元的结构,因此它不适用于该类型。)
关于rust - syn::parse::ParseBuffer::peek() 如何接受类型作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67555425/