Rust 如何在某些结构的静态函数调用中解析类型注释

Rust how to resolve type annotations in a static function call of some struct

一般来说,我知道如何使用 ::<T> 语法或 <T as X>:: 语法来解析类型。但不是在这个特定的例子中。 我怎样才能得到下面的代码来编译?

fn main() {
    Namespace::apply(&mut Obj1 { v: vec![1, 2, 3] });
}

pub trait Func<T> {
    fn func(data: &mut T);
}

pub trait Apply<T, X: Func<T>> {
    fn apply(data: &mut T);
}

pub struct Namespace {}

pub struct Obj1 {
    v: Vec<i32>,
}
pub struct Obj2 {
    v: Vec<i32>,
}

impl Func<Obj1> for Namespace {
    fn func(data: &mut Obj1) {
        println!("FuncA()");
        data.v.clear(); // do stuff with data
        println!("{:?}", data.v);
    }
}
impl Func<Obj2> for Namespace {
    fn func(data: &mut Obj2) {
        println!("FuncB()");
        data.v.push(4); // do stuff with data
        println!("{:?}", data.v);
    }
}
impl<T, X: Func<T>> Apply<T, X> for Namespace {
    fn apply(data: &mut T) {
        println!("apply()");
        X::func(data);
    }
}

我收到以下错误:

error[E0282]: type annotations needed
  --> src\lib.rs:18:9
   |
18 |         Namespace::apply(&mut Obj1 { v: vec![1, 2, 3] });
   |         ^^^^^^^^^^^^^^^^ cannot infer type for `X`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0282`.

我在 apply 周围的各个地方尝试了 ::<Obj1, Func<Obj1>>:: 语法,但总是出错。

上下文: 这主要是一个抽象的问题,我并不想在幕后实现任何具体的目标。在回答时,请假设我只是一个奇怪的人,认为 OOP 是邪恶的并且不想在 trait 中使用 self/&self。我的想法是首先将一些方法定义为某个占位符Namespace结构中的函数func,为不同的对象实现它,然后我想定义一个使用[=16]的apply函数=] 方法以抽象的通用方式。如果你对如何实现这个目标有更好的建议,我很高兴听到他们。

X 类型未在函数签名或结构参数中声明,因此,编译器无法推断出适当的类型。

为了避免这个问题,你需要显式地告诉想要的 X 并且因为特征函数没有接收者(self, &self, &mut self, self: Pin<Self>),可以"cast"具体类型。

<Namespace as Apply<Obj1, Namespace>>::apply(&mut Obj1 { v: vec![1, 2, 3] });