为何Rust限定路径模式可接受常量、结构体和枚举变体(与文档冲突)
Rust限定路径模式的规则误解解答
关键:文档里的“限定路径模式”不是指所有带模块前缀的路径
你误解了参考文档中“限定路径模式”的定义——它特指通过Self::或<具体类型>::形式来限定的关联项路径,而非普通的模块层级全限定路径。
逐个解析你的示例代码
m::n::CONST:这是模块常量的全限定写法,属于非限定路径模式的显式形式,文档明确允许非限定路径引用常量,所以编译正常。m::n::S {}:无字段结构体的全限定模块路径,同样属于非限定路径模式,符合“非限定路径可引用结构体”的规则。m::n::E::V:枚举变体的全限定模块路径,属于非限定路径模式,文档允许非限定路径引用枚举变体,因此合法。m::n::A::ASSOC_CONST:这才是文档所说的限定路径模式——通过类型A来限定它的关联常量,完全符合“限定路径模式仅可引用关联常量”的要求。
验证文档规则的真正约束
如果尝试用限定路径模式去引用非关联项,比如用类型限定来引用模块常量,编译器会直接报错,这才是文档规则的体现:
mod m { pub mod n { pub const CONST: i32 = 1; pub struct A; } } fn main() { let v = 10; match v { // 编译错误:`CONST` 不是 `m::n::A` 的关联项 <m::n::A>::CONST => (), _ => (), } }
内容的提问来源于stack exchange,提问作者Eraklon
相关产品推荐
相关产品推荐

