二进制运算==不能应用于syn :: Path

问题描述

当我使用my fork of async-trait作为依赖项时,由于syn::*类型相等,它无法编译。 All is green in async-trait CI checks。要进行复制,请启动一个新的cargo lib项目并添加到Cargo.toml:

[dependencies]
syn = { version = "1.0.39",features = ["full"] }

在lib.rs中:

pub fn cmp(a: syn::Path,b: syn::Path) -> bool {
    a == b
}

在Rust 1.46.0上编译会导致错误

error[E0369]: binary operation `==` cannot be applied to type `syn::Path`
 --> src/lib.rs:4:7
  |
4 |     a == b
  |     - ^^ - syn::Path
  |     |
  |     syn::Path

error: aborting due to prevIoUs error

syn::Path implements Eq/PartialEq with feature "full" or "derive"

use syn; // 1.0.33

fn cmp(a: syn::Path,b: syn::Path) -> bool {
    a == b
}

我探索了syn的PartialEqEq特征实现在“完整”或“派生”功能门的背后,但我仍然一无所知。

明确尝试1.0.33版,该版本可在操场上使用,在我的PC上也能获得相同的结果。

我已经经历了将异步特性分开并将其折叠在一起的障碍,但这超出了我的技能。

  • rustc 1.46.0(04488afe3 2020-08-24)
  • 货物1.46.0(149022b1d 2020-07-17)

cargo tree一个带有syn的新项目:

tmp v0.1.0 (/home/debian/Documents/Projects/tmp)
└── syn v1.0.39
    ├── proc-macro2 v1.0.19
    │   └── unicode-xid v0.2.1
    ├── quote v1.0.7
    │   └── proc-macro2 v1.0.19 (*)
    └── unicode-xid v0.2.1

解决方法

在启用功能syn::Pathfull的同时 type derive可用时,为该类型实现的某些特征不是。

尤其是as per syn's documentation of optional featuresextra-traits功能是获得PartialEq所必需的:

extra-traits-所有语法树类型的Debug,Eq,PartialEq,Hash表示。

因此,您只需要使用{p>

Cargo.toml