การดำเนินการไบนารี == ไม่สามารถใช้กับประเภท syn :: Path

Sep 01 2020

เมื่อฉันใช้ทางแยกของ async-traitเป็นการอ้างอิงการรวบรวมจะล้มเหลวเนื่องจากsyn::*ความเท่าเทียมกันของประเภท ทั้งหมดเป็นสีเขียวในการตรวจสอบ CI-async ลักษณะ ในการทำซ้ำให้เริ่มโปรเจ็กต์ 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การดำเนินการEq/ ที่PartialEqมีคุณลักษณะ "เต็ม" หรือ "ได้รับ" :

use syn; // 1.0.33

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

ฉันสำรวจแล้วว่าการใช้งาน Syn PartialEqและEqtrait อยู่หลังประตูคุณลักษณะ "เต็ม" หรือ "ได้รับ" แต่ฉันก็ยังไม่ทราบแน่ชัด

พยายามเวอร์ชัน 1.0.33 อย่างชัดเจนซึ่งใช้งานได้ในสนามเด็กเล่นผลลัพธ์เดียวกันบนพีซีของฉัน

ฉันผ่านอุปสรรคของการแยกลักษณะ async ออกจากกันและพับกลับเข้าด้วยกัน แต่นี่เหนือทักษะของฉัน

  • สนิม 1.46.0 (04488afe3 2020-08-24)
  • สินค้า 1.46.0 (149022b1d 2020-07-17)

cargo tree ในโครงการใหม่ด้วยการซิงค์:

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

คำตอบ

8 mcarton Sep 01 2020 at 06:17

แม้ว่าประเภท syn::Pathจะพร้อมใช้งานเมื่อเปิดใช้งานคุณสมบัติfullหรือderiveเปิดใช้งานลักษณะบางอย่างที่ใช้สำหรับประเภทนั้นจะไม่

โดยเฉพาะอย่างยิ่งตามsynเอกสารของของคุณสมบัติตัวเลือกที่extra-traitsคุณสมบัติจะต้องได้รับPartialEq:

extra-traits - Debug, Eq, PartialEq, Hash แสดงถึงประเภทโครงสร้างไวยากรณ์ทั้งหมด

ดังนั้นคุณต้องปรับเปลี่ยนCargo.tomlด้วย

syn = { version = "1.0.39", features = ["full", "extra-traits"] }