rust - syn::parse::ParseBuffer::peek() 如何接受类型作为参数?

标签 rust rust-proc-macros

我们如何能够将类型作为参数而不是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 })
    }
}

Playground

代码为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 })
    }
}

Playground

以下是peek的源代码来自syn :

pub fn peek<T: Peek>(&self, token: T) -> bool {
    let _ = token;
    T::Token::peek(self.cursor())
}

Source code

最佳答案

peek函数接受标记,而不是类型。

接受的原因Token[;]是它扩展为一个标识符,即名称 a type ,同时也是 global function对文档隐藏!您的类型别名引用该类型,并且尝试使用类似单元的结构的构造函数语法构造一个值,会使编译器提示此类语法不适用于类型别名。 (即使确实如此, Semi 也不是一个类似单元的结构,因此它不适用于该类型。)

关于rust - syn::parse::ParseBuffer::peek() 如何接受类型作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67555425/

相关文章:

rust - 过程宏可以作为函数进行调试吗?

rust - 如何在每个结构上自动#derive(Something)(可能带有过滤)?

reference - 构建具有特定生命周期的对象

rust - 将枚举变体用作函数的这种奇怪语法是什么?

rust - 转换类型里面的报价!给出特征错误

rust - 如何找到 syn::parse 的正确返回类型?

debugging - 如何查看导致我的编译错误的扩展宏代码?

Rust 关闭工厂函数

rust - 如何为具有AtomicUsize字段的结构实现Drop?

path - 从 Rust 中的给定路径中惯用地提取文件扩展名