Rust为函数指针实现Trait后调用方法报未找到错误是什么原因
问题核心原因
- Rust 中每个具名函数都有独立的函数项类型(fn item type),和通用的函数指针类型是两种不同的类型:你代码里
bar的类型是专属的fn(i32) {bar},不是你实现了Footrait 的通用fn(i32)指针类型,编译器自然找不到do_it方法。 - 函数项类型是零大小的,仅代表具体的某个函数,不会占用运行时空间;而函数指针是存储函数地址的运行时变量,大小和usize一致。
修复方案
两种常用修复方式:
1. 显式把函数项转为通用函数指针
调用时做一次类型转换即可匹配到你写的impl:
fn baz() { (bar as fn(i32)).do_it(7); }
2. 给所有符合签名的可调用类型实现Foo
如果不想每次调用都转类型,可以把impl改成适配所有实现了Fn(i32)的类型,自动覆盖所有同签名的函数项、闭包、函数指针:
trait Foo { fn do_it(&self, i: i32); } impl<T: Fn(i32)> Foo for T { fn do_it(&self, i: i32) { self(i) } } fn bar(i: i32) {} fn baz() { bar.do_it(7); // 直接调用即可 }
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

