微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我们如何将类型作为参数而不是 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的{​​{1}}的源代码

syn

Source code

解决方法

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

它接受 Token[;] 的原因是它扩展为一个标识符,即 a type 的名称,但也是一个 global function 对文档隐藏的标识符!您的类型别名是指类型,并且尝试使用构造函数语法为类似单元的结构构造一个值会使编译器抱怨这种语法不适用于类型别名。 (即使是这样,Semi 也不是类似单元的结构体,因此它尤其不适用于该类型。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。