如何从不将 vec 作为参数的回调内部将值存储在 Vec 中?
How to store values in a Vec from inside a callback that does not take the vec as an argument?
我正在使用一个具有回调函数机制的板条箱。回调是用户定义的,但具有不允许传递其他值的特定签名。例如:
fn callback(id: u32, value: u32) -> u32;
// and would be used as such
library_function(callback);
所以如果我只需要保存到文件或打印,这会很好,但是我需要将值保存到向量中。
例如 Python,我会做的是使用带有 "predefined" 个参数的 lambda:
def mycallback(predefined, id, value)
# and calling it as such
predefined = []
library_function(lambda *args: mycallback(predifined, *args)
该解决方案可能涉及 Rust 的其他技巧,但它不能每次都写入文件,因为这似乎是一个太大的性能问题。
只需使用闭包:
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));
}
我们称它们为 闭包 的原因是因为它们 "close over" 它们的环境。这允许我们使用(在这种情况下修改)闭包定义范围内的变量。
参见:
我正在使用一个具有回调函数机制的板条箱。回调是用户定义的,但具有不允许传递其他值的特定签名。例如:
fn callback(id: u32, value: u32) -> u32;
// and would be used as such
library_function(callback);
所以如果我只需要保存到文件或打印,这会很好,但是我需要将值保存到向量中。 例如 Python,我会做的是使用带有 "predefined" 个参数的 lambda:
def mycallback(predefined, id, value)
# and calling it as such
predefined = []
library_function(lambda *args: mycallback(predifined, *args)
该解决方案可能涉及 Rust 的其他技巧,但它不能每次都写入文件,因为这似乎是一个太大的性能问题。
只需使用闭包:
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));
}
我们称它们为 闭包 的原因是因为它们 "close over" 它们的环境。这允许我们使用(在这种情况下修改)闭包定义范围内的变量。
参见: