2016-01-24 32 views
0

我試圖將Python腳本轉換爲Rust作爲學習體驗,並使工具更快速並縮小代碼/可執行文件的大小。什麼是習慣方法來創建一個方法的參考集合採取自我?

我目前正試圖轉換一個部分,它創建一個對自我方法的引用列表。現在我已經瞭解到,沒有辦法爲一個方法綁定self變量,必須使用閉包並關閉方法將被調用的對象。然而,當你創建一個閉包時,它會被分配一個唯一的匿名類型,所以我不認爲我可以創建一個Vec或閉包數組而不用裝箱,這可能是要走的路,但有一些可能並不必要的開銷。

我想知道的是,而不是方法引用列表的Python知情的設計,是否有一個更生鏽的方式來做到這一點,不與戰鬥類型系統?

self.dataProcessors = [] 
if(self.dataMode) : 
    self.dataProcessors.append(self._processData_) 
if(self.csvOn): 
    self.dataProcessors.append(self._processData_CSV_) 

回答

6

說實話,我不知道一個更生鏽方式,但是,是的,你可以做同樣的方式在Python:

struct Data; 

impl Data { 
    fn foo(&self) { 
     println!("foo!"); 
    } 
    fn bar(&self) { 
     println!("bar!"); 
    } 
} 

fn main() { 
    let x: Vec<fn(&Data) ->()> = vec![Data::foo, Data::bar]; 

    let data = Data; 
    for f in x { 
     f(&data); 
    } 
} 

注意這與Python完全一樣:不是保留self,而是明確地將它作爲現在函數的第一個參數傳遞,該函數曾經是一種方法。

由於沒有必要存儲的任何值(如果您關閉來到這將是必要的),基本上你已經是fn(&Data) ->()型,這是很好的一個函數指針(即採取Data和回報type of functions單位),所以它的大小是已知的,你不需要拳擊。

相關問題