如何将结构的成员函数作为回调传递给另一个结构

时间:2017-04-07 09:00:32

标签: rust

我想将结构的成员函数传递给另一个结构。

抱歉,英语不好,无法说出更多详情。

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 ?
    };
}

1 个答案:

答案 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