我有以下问题:

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

编辑:在rustplayground 中添加了一个最小的示例.这段代码让我烦恼的是,我想摆脱硬编码&B在某些函数中,因为这不适用于 struct 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=debug&edition=2021&gist=53ac44cb660d180b3c7351e394355692

推荐答案

听起来你想要的是closure而不是函数指针.这将允许您完全消除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)
    }
}

C美元也是如此.

现在,函数需要哪些额外数据有no个限制.以前,甚至没有一种方法来表示回调不需要引用参数的情况.现在这无关紧要了,因为关闭可以捕获它需要的东西,而这不再是A::some_func_a()的责任.

(Playground)


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

Rust相关问答推荐

给定使用newype习语定义的类型上的铁 rust Vec,有没有方法获得底层原始类型的一部分?

trait 中self 的显式生命周期似乎导致E0499无法在循环中多次borrow * emits 器作为可变的

为什么我可以跟踪以前borrow 过的变量?房主在哪里?

如何实现泛型枚举的`Serde::Desialize`特性

在铁 rust 中传递所有权

如何正确重新排列代码以绕过铁 rust 借入判断器?

如何从ruust中的fig.toml中读取?

AXUM一路由多个不包括URL的参数类型

Tokio';s io::用Cursor拆分<;Vec<;u8>>;赢得';t get the full writted data

实现 Deref 的 struct 可以返回对外部数据的引用吗?

UnsafeCell:它如何通知 rustc Select 退出基于别名的优化?

从 rust 函数返回 &HashMap

更新 rust ndarray 中矩阵的一行

从 Axum IntoResponse 获取请求标头

在 Rust 中,我如何处理请求 javascript 的页面?

强制特征仅在 Rust 中的给定类型大小上实现

仅在运行测试时生成调试输出

如何获得对数组子集的工作可变引用?

是否有适当的方法在参考 1D 中转换 2D 数组

如何在不设置精度的情况下打印浮点数时保持尾随零?