为何在Rust中调用Trait::f(&true as &dyn Trait)仍使用bool的Trait实现?
Rust中dyn Trait固有方法与Trait类型实现的区别及你的代码输出分析
核心概念区分
- 你给
bool实现的Trait::f:是该类型对Trait方法的具体实现,属于Trait方法调度链的一部分,会被Trait的调用逻辑优先触发。 - 你给
dyn Trait实现的f:是dyn Trait这个动态类型对象的固有方法,不属于Trait的方法集合,不会被Trait的方法调用逻辑触发。
你的代码所有调用都在触发Trait的方法
逐个分析main里的调用:
Trait::f(&true);:编译器推断参数类型为&bool,直接调用bool的Trait实现,输出2。Trait::f(&true as &dyn Trait);:参数是&dyn Trait,但Trait::f是Trait方法,会通过虚表(vtable)找到底层具体类型(bool)的实现,输出2。<_ as Trait>::f(&true);:_被推断为bool,调用bool的Trait实现,输出2。<_ as Trait>::f(&true as &dyn Trait);:_被推断为dyn Trait,但<dyn Trait as Trait>::f依然是Trait方法,通过虚表调用bool的实现,输出2。<bool as Trait>::f(&true);:明确指定调用bool的Trait实现,输出2。<dyn Trait as Trait>::f(&true as &dyn Trait);:这里的<dyn Trait as Trait>对应Trait在动态对象上的调度逻辑,依然会通过虚表调用底层bool的实现,输出2。
如何触发dyn Trait的固有方法
要调用你给dyn Trait定义的固有方法,需要直接以dyn Trait类型的名义调用,而非通过Trait的方法名:
fn main() { let dyn_ref: &dyn Trait = &true; // 直接调用dyn Trait的固有方法 <dyn Trait>::f(dyn_ref); // 输出1 }
内容的提问来源于stack exchange,提问作者Lokesh
相关产品推荐
相关产品推荐

