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

Cam*_*rzt 1 idiomatic rust

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

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

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

self.dataProcessors = []
if(self.dataMode) :
    self.dataProcessors.append(self._processData_)
if(self.csvOn):
    self.dataProcessors.append(self._processData_CSV_)
Run Code Online (Sandbox Code Playgroud)

kir*_*gin 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这与Python中的完全相同:不是保留self,而是将其显式传递为now-function的第一个参数,该函数曾经是一个方法.

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