创建对采用自我的方法的引用集合的惯用方法是什么?
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 functions 以 Data
和 return 为单位),所以它的大小是已知的,你不需要装箱。
我正在尝试将 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 functions 以 Data
和 return 为单位),所以它的大小是已知的,你不需要装箱。