Function 如何从不将Vec作为参数的回调内部将值存储在Vec中?

Function 如何从不将Vec作为参数的回调内部将值存储在Vec中?,function,lambda,rust,arguments,closures,Function,Lambda,Rust,Arguments,Closures,我正在使用一个具有回调函数机制的板条箱。回调是用户定义的,但具有特定的签名,不允许传递其他值。例如: fn回调(id:u32,value:u32)->u32; //并将作为这样使用 库函数(回调); 因此,如果我只需要保存到文件或打印,这将是很好的,但是我需要将值保存到向量。 例如,在Python中,我会使用带有“预定义”参数的lambda: def mycallback(预定义、id、值) #就这样称呼它 预定义=[] 库函数(lambda*args:mycallback(预定义,*args

我正在使用一个具有回调函数机制的板条箱。回调是用户定义的,但具有特定的签名,不允许传递其他值。例如:

fn回调(id:u32,value:u32)->u32;
//并将作为这样使用
库函数(回调);
因此,如果我只需要保存到文件或打印,这将是很好的,但是我需要将值保存到向量。 例如,在Python中,我会使用带有“预定义”参数的lambda:

def mycallback(预定义、id、值)
#就这样称呼它
预定义=[]
库函数(lambda*args:mycallback(预定义,*args)
解决方案可能涉及其他生锈技巧,但不能每次都写入文件,因为这似乎是一个太多的性能问题。

只需使用一个闭包:

let mut vec = Vec::new();
library_function(|id, value| {
    vec.push(value);
    id
});
与Python代码等效的代码是:

fn callback(vec: &mut Vec<u32>, id: u32, value: u32) -> u32 {
    vec.push(value);
    id
}

fn main(){
    let mut predefined = Vec::new();
    library_function(|id, value| callback(&mut predefined, id, value));
}
fn回调(vec:&mut-vec,id:u32,值:u32)->u32{
矢量推力(值);
身份证件
}
fn main(){
让mut预定义=Vec::new();
库函数(| id,value |回调(&mut预定义,id,value));
}

我们之所以称它们为闭包,是因为它们“关闭”了自己的环境。这允许我们使用(在本例中修改)定义闭包的范围内的变量

见:

  • 在公园里

@Dominus我强烈建议你以自己的方式阅读这本书。书中会有很多新概念——即使你一开始没有完全掌握它们,你至少会熟悉它们的名称。