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

What is the idiomatic way to create a collection of references to methods that take self?

我正在尝试将 Python 脚本转换为 Rust 作为学习经验,并使该工具更快并缩小 code/executable 的大小。

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

我想知道的是,除了 Python 方法引用列表的明智设计之外,是否有更 Rusty 的方式来做到这一点而不与类型系统冲突?

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

老实说,我不确定更 鲁棒 的方法,但是,是的,您可以使用与 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) -> () 类型,也就是 type of functionsData 和 return 为单位),所以它的大小是已知的,你不需要装箱。