什么是创建自我方法的引用集合的惯用方法?

时间:2016-01-24 19:24:48

标签: rust idiomatic

我正在尝试将Python脚本转换为Rust作为学习体验,并使工具更快并缩小代码/可执行文件的大小。

我目前正在尝试转换一个部分,该部分创建了一个自我方法的引用列表。现在我已经知道没有办法绑定方法的self变量,必须使用闭包并关闭将调用方法的对象。但是当你创建一个闭包时,它会被分配一个唯一的匿名类型,所以我不认为我可以创建一个Vec或闭包数组而不用装箱它们,这可能是要走的路,但有一些开销可能没有必要。

我想知道的是,有没有一种更生锈的方法可以做到这一点而不是类型系统的类型系统,而不是Python通知设计的方法引用列表?

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

1 个答案:

答案 0 :(得分: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,而是将其显式传递为now-function的第一个参数,该函数曾经是一个方法。

由于不需要存储任何值(如果你使用闭包这将是必要的),基本上你只有一个函数指针(类型为fn(&Data) -> (),这就是{{3}取Data并返回单位),所以它的大小是已知的,你不需要拳击。