Rust中带const布尔泛型的方法为何无法调用为true/false实现的方法
问题原因
Rust的泛型类型检查遵循定义时检查原则,而非实例化时检查:编译器在处理泛型impl的定义时,只会基于你给出的泛型约束校验代码合法性,不会主动穷举泛型参数的所有可能取值来验证方法是否存在。即使bool只有true/false两个取值,编译器也不会默认认为所有MyStruct<B>都实现了bar方法,这一规则和泛型参数的取值范围大小无关,是为了保证类型检查逻辑的一致性和性能。
解决方案
方案1:通过 trait 约束保证方法存在(稳定可用)
先定义一个包含bar方法的trait,为两个const取值的MyStruct都实现该trait,再给泛型impl加上对应的约束即可:
struct MyStruct<const B: bool>; trait HasBar { fn bar(); } impl HasBar for MyStruct<false> { fn bar() { println!("false"); } } impl HasBar for MyStruct<true> { fn bar() { println!("true"); } } impl<const B: bool> MyStruct<B> where Self: HasBar { pub fn foo() { Self::bar() } } fn main() { MyStruct::<false>::foo(); MyStruct::<true>::foo(); }
编译运行后输出和你之前的正常版本完全一致:
false true
方案2:使用const分支(需Nightly Rust)
如果你可以使用Nightly版本的Rust,开启generic_const_exprs特性后,可以直接在泛型方法内对const参数做分支匹配,手动覆盖所有可能的取值:
#![feature(generic_const_exprs)] #![allow(incomplete_features)] struct MyStruct<const B: bool>; impl MyStruct<false> { pub fn bar() { println!("false"); } } impl MyStruct<true> { pub fn bar() { println!("true"); } } impl<const B: bool> MyStruct<B> { pub fn foo() { match B { true => MyStruct::<true>::bar(), false => MyStruct::<false>::bar(), } } } fn main() { MyStruct::<false>::foo(); MyStruct::<true>::foo(); }
这个方案不需要额外定义trait,但是依赖尚未稳定的const泛型特性,不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者FreD
相关产品推荐
相关产品推荐

