方法作为自变量,包括自引用



我有以下问题:我有两个结构A和B,A实现了一个方法,该方法以另一个方法为参数。然后我在B中创建一个A的实例。然后用B的方法作为参数调用A的方法。然而,B的传递方法包含self作为参数,因为我必须访问传递方法中B的一些其他字段。

我目前的计划是将方法本身传递给A中的方法,并自引用B的实例。然而,我很难处理类型定义。我可以将第二个参数的类型硬编码为B,但是,我希望保持它打开,以防结构C也希望使用a中的方法。因此,我希望将第二参数的类型设置为结构的类型,第一个参数中的方法源自该结构。有办法做到这一点吗?我在考虑泛型,然而,我还没能实现它

编辑:在铁锈操场上添加了一个最小的例子。这个代码让我困扰的是,我想去掉硬编码的&some_func_a中的B,因为这不适用于结构C。

struct A {}
impl A {
fn some_func_a(&self, passed_fn: fn(&B, i32), cur_self: &B) {
passed_fn(cur_self, 21);
}
}
struct B {
some_val: i32,
}
struct C {
some_val: u32, // different field here than in B
}
impl B {
fn call_fn_in_a(&self, a: A) {
a.some_func_a(B::some_func_b, self);
}
fn some_func_b(&self, passed_val: i32) {
println!("The value is {}, passed was {}", self.some_val, passed_val)
}
}
impl C {
fn call_fn_in_a(&self, a: A) {
// this line here breaks, since &B is hard coded
a.some_func_a(C::some_func_c, self);
}
fn some_func_c(&self, passed_val: i32) {
println!("this is a new function, val is {}, passed was {}", self.some_val, passed_val)
}
}
fn main() {
let a = A {};
let b = B {
some_val: 42,
};

let b = B {
some_val: 42,
};
b.call_fn_in_a(a);
}

https://play.rust-lang.org/?version=stable&mode=调试&edition=2021&gist=53ac44cb660d180b3c7351e394355692

听起来你想要一个闭包而不是函数指针。这将允许您完全消除A::some_func_a()的额外参数:

impl A {
fn some_func_a(&self, passed_fn: impl FnOnce(i32) -> ()) {
passed_fn(21);
}
}

现在我们可以用与调用签名匹配的任何闭包来调用这个函数。例如:

impl B {
fn call_fn_in_a(&self, a: A) {
a.some_func_a(|v| self.some_func_b(v));
}
fn some_func_b(&self, passed_val: i32) {
println!("The value is {}, passed was {}", self.some_val, passed_val)
}
}

对于CCD_ 2也是如此。

现在,函数需要的额外数据没有限制。以前甚至没有一种方法来表达回调不需要引用参数的情况。现在这并不重要,因为闭包可以捕获它所需要的内容,并且不再是A::some_func_a()的责任。

(游乐场(


旁注:您可能希望call_fn方法通过引用(&A(而不是通过值来获取A。否则,调用这些函数会消耗A值,需要您制作另一个值来再次调用这些函数。

最新更新