2017-04-07 72 views
1

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

对不起,英文不好,不能说更多的细节。

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

回答

4

你非常接近!要引用方法或任何其他符号,请使用::分隔符并指定所述符号的路径。方法或相关函数位于类型的名称空间中,因此您的方法的路径为Struct1::do_some。在Java中,您还可以使用.运算符来访问这些运算符,但在Rust中,.运算符仅用于现有对象,而不用于类型名称。因此

解决的办法是:

let s2 = Struct2 { 
    cb1: Box::new(Struct1::do_some), 
}; 

然而,你可能改善你的函数一点的类型。 Box<Fn(...)>是一个盒装特质对象,但如果您不想使用闭包,则不一定需要这样做。如果你只是想引用“正常功能”(那些没有的环境中谁),你可以用一个函数指针来代替:

struct Struct2 { 
    cb1: fn(&mut Struct1, &str), 
} 

注意小写fn而且我们不需要Box

相关问题