我想将结构的成员函数传递给另一个结构。
抱歉,英语不好,无法说出更多详情。
use std::thread;
struct Struct1 {}
impl Struct1 {
pub fn do_some(&mut self, s: &str) {
// do something use s to modify self
}
}
struct Struct2 {
cb1: Box<Fn(&mut Struct1, &str)>,
}
fn main() {
let s1 = Struct1 {};
let s2 = Struct2 {
cb1: Box::new(s1.do_some), // how to store do_some function in cb1 ?
};
}
答案 0 :(得分:4)
你非常接近!要引用方法或任何其他符号,请使用::
分隔符并指定所述符号的路径。方法或相关函数存在于类型的命名空间中,因此方法的路径为Struct1::do_some
。在Java中,您还可以使用.
运算符来访问它们,但在Rust中,.
运算符仅用于现有对象,而不是类型名称。
解决方案是:
let s2 = Struct2 {
cb1: Box::new(Struct1::do_some),
};
但是,您可以稍微改进一下您的功能类型。 Box<Fn(...)>
是一个盒装特征对象,但如果您不想使用闭包,则不一定需要它。如果您只是想参考&#34;正常功能&#34; (那些没有环境的人),你可以使用函数指针代替:
struct Struct2 {
cb1: fn(&mut Struct1, &str),
}
请注意小写fn
,我们不需要Box
。