2017-04-07 32 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(...)>はboxed traitオブジェクトですが、クロージャを使用したくない場合は必ずしもその必要はありません。あなただけの「正常な機能」(環境を持っていない人)を参照したい場合は、代わりに関数ポインタを使用することができます。

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

注意を小文字fn、我々はBoxを必要としないこと。

関連する問題