与 Rust 泛型作斗争

问题描述 投票:0回答:1

我仍在与 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>();
}
generics rust
1个回答
1
投票

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.