2017-04-07 70 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

相關問題