我仍在与 Rust 泛型作斗争。下面的代码尽可能简化了我当前面临的问题。这段代码会导致编译错误,我根本不明白为什么它不起作用。详细信息已记录在源代码注释中。可以请您看一下并提供一些建议吗?
// Assume this trait is NOT object safe, so we cannot use dynamic dispatch
// like `Box<dyn Callable>` and `&dyn Callable`.
trait Callable {
fn call(&self);
}
struct Test;
impl Callable for Test {
fn call(&self) {}
}
fn f<T: Callable>() {
let callback = |v: T| { v.call(); };
// The `Test` type has implemented the `Callable` trait. Then why can't
// `Test{}` be passed to a variable as `T: Callable`?
callback(Test{});
}
fn main() {
f::<Test>();
}
Rust 中的泛型由调用者选择,无论调用者选择泛型如何,函数都必须工作;调用
f::<T>()
必须适用于 T: Callable
的 any选择。
callback
属于 Fn(T)
类型,但使用参数 Test{}
进行调用,该参数(不一定)不是 T
类型。
如果你想坚持这种设计,这里没有真正的解决办法,因为闭包不能是通用的。你只需写
Test{}.call();
。但是你可以将 callback
设为通用函数而不是闭包。
fn callback<T: Callable>(v: T) {
v.call();
}
fn f() {
callback(Test{});
}
fn main() {
f();
}