gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:20:05 24 4
gpt4 key购买 nike

一般来说,我知道如何使用 ::<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`.

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

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

最佳答案

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

要规避这个问题,需要显式告诉想要的X由于 trait 函数没有接收者( self&self&mut selfself: Pin<Self> ),因此可以“转换”具体类型。

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

关于Rust 如何在某些结构的静态函数调用中解析类型注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57228420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com