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] });
一般来说,我知道如何使用 ::<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] });