gpt4 book ai didi

rust - 在这种情况下,借用的值(value)不够长( Vec<&Fn(i32) -> i32> )

转载 作者:行者123 更新时间:2023-11-29 07:59:52 24 4
gpt4 key购买 nike

我有这个错误,其他时候我有类似的事情,我已经能够以不同的方式解决,但现在不是在这种情况下如何解决:

borrowed value does not live long enough in

我将失败的代码移动了一个更简单的,但我找不到错误:

fn main(){

let mut v: Vec<&Fn(i32) -> i32> = Vec::new();

v.push(&ops_code1);
//v.push(&ops_code2);
//v.push(&ops_code3);
}

fn ops_code1(value: i32) -> i32 {
..//

error: borrowed value does not live long enough

v.push(&ops_code1);

play.rust

最佳答案

您在这里所做的是创建闭包 Vec。在 Rust 中,静态函数的处理方式与闭包略有不同,因此当我们创建引用时,实际上会创建一个闭包。如果我们在创建 Vec 之后这样做,结果闭包的生命周期会比 Vec 短,这是一个错误。我们可以使用 let 在 Vec 之前创建闭包,提供足够长的生命周期,比 Vec 长:

fn main() {
let extended = &ops_code1;

let mut v: Vec<&Fn(i32) -> i32> = Vec::new();

// Note that placing it here does not work:
// let extended = &ops_code1;

v.push(extended);
//v.push(&ops_code2);
//v.push(&ops_code3);

}

fn ops_code1(value: i32) -> i32 {
println!("ops_code1 {}", value);
value
}

Rust Playground

但是,如果您只使用静态函数——而不是闭包——下面的代码也可以正常工作,并且让您避免额外的 let:

fn main() {
let mut v: Vec<fn(i32) -> i32> = Vec::new();

v.push(ops_code1);
v.push(ops_code2);
}

fn ops_code1(value: i32) -> i32 {
println!("ops_code1 {}", value);
value
}

fn ops_code2(value: i32) -> i32 {
println!("ops_code2 {}", value);
value
}

Rust Playground

第三种选择是使用盒装闭包,它让您可以同时使用闭包和静态函数而无需额外的 let,但有其自身的权衡:

fn main() {
let mut v: Vec<Box<Fn(i32) -> i32>> = Vec::new();

v.push(Box::new(ops_code1));
v.push(Box::new(ops_code2));

for f in v {
f(1);
}
}

fn ops_code1(value: i32) -> i32 {
println!("ops_code1 {}", value);
value
}

fn ops_code2(value: i32) -> i32 {
println!("ops_code2 {}", value);
value
}

Rust Playground

关于rust - 在这种情况下,借用的值(value)不够长( Vec<&Fn(i32) -> i32> ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36392323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com