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

Dom*_*nus 2 lambda closures arguments function rust

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

fn callback(id: u32, value: u32) -> u32;

// and would be used as such
library_function(callback);
Run Code Online (Sandbox Code Playgroud)

因此,如果我只需要保存到文件或打印,那么这会很好,但是我需要将值保存到向量中。例如,我会在 Python 中使用带有“预定义”参数的 lambda:

def mycallback(predefined, id, value)

# and calling it as such
predefined = []
library_function(lambda *args: mycallback(predifined, *args)
Run Code Online (Sandbox Code Playgroud)

该解决方案可能涉及 Rust 的其他技巧,但是它不能每次都写入文件,因为这似乎是一个太大的性能问题。

Pet*_*all 6

只需使用闭包:

let mut vec = Vec::new();
library_function(|id, value| {
    vec.push(value);
    id
});
Run Code Online (Sandbox Code Playgroud)

相当于你的 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));
}
Run Code Online (Sandbox Code Playgroud)

我们称它们为闭包的原因是因为它们“封闭”了它们的环境。这允许我们使用(并在这种情况下修改)定义闭包的范围内的变量。

看:

  • @Dominus 我强烈建议您阅读这本书。将会有很多新概念—​​—即使你一开始没有掌握它们,你至少会熟悉它们的名称。 (2认同)