Rust调用impl trait变量关联函数报E0433错误的解决方法
报错原因
你定义的trait_function是不带self参数的关联函数,不属于实例绑定的方法。Rust 中路径::关联项的调用语法要求::左侧必须是类型、模块或者 crate 名,不能是实例变量。你写item::trait_function()时,编译器会把循环变量item当成模块/crate去解析,自然触发找不到项的报错。
对应修复方案
根据你的实际使用场景二选一即可:
方案1:需要通过实例触发调用(绝大多数场景)
给trait_function加上&self参数,把它改成实例方法,就可以通过.语法在实例变量上直接调用:
trait SomeTrait { // 加&self成为实例方法 fn trait_function(&self) { println!("Rust works !"); } } struct MyStruct {} impl SomeTrait for MyStruct {} fn test(items: Vec<impl SomeTrait>) { for item in items { // 实例方法用.调用 item.trait_function(); } } fn main () { test(vec![MyStruct{}, MyStruct{}]); }
如果需要在Vec里存放多种不同的、实现了SomeTrait的类型,把参数改成动态分发的trait对象即可:
// 另一个实现SomeTrait的示例结构 struct OtherStruct {} impl SomeTrait for OtherStruct {} fn test(items: Vec<Box<dyn SomeTrait>>) { for item in items { item.trait_function(); } } fn main () { test(vec![Box::new(MyStruct{}), Box::new(OtherStruct{})]); }
方案2:确实不需要实例参与逻辑,保留无self的关联函数
关联函数本身和类型绑定,不和具体实例挂钩,不需要通过实例变量调用,把test改成泛型约束写法,直接通过泛型类型调用关联函数即可:
trait SomeTrait { fn trait_function() { println!("Rust works !"); } } struct MyStruct {} impl SomeTrait for MyStruct {} // 泛型T约束为实现SomeTrait的类型 fn test<T: SomeTrait>(items: Vec<T>) { for _item in items { // 通过泛型类型调用关联函数 T::trait_function(); } } fn main () { test(vec![MyStruct{}, MyStruct{}]); }
注意:无self的关联函数不支持动态分发,如果你要在Vec里混装不同实现类型,就不能用这种写法——关联函数没有存在于trait对象的vtable中,无法在运行时根据实例类型动态匹配对应实现。
内容的提问来源于stack exchange,提问作者Sergio Ivanuzzo
相关产品推荐
相关产品推荐

