gpt4 book ai didi

rust - 引用“静态生命周期不长?

转载 作者:行者123 更新时间:2023-12-03 11:46:32 26 4
gpt4 key购买 nike

考虑下一个代码:

fn get_ref<'a, R>(slice: &'a Vec<i32>, f: fn(&'a Vec<i32>) -> R) -> R
where
R: 'a,
{
f(slice)
}

fn main() {
let v = [1,2,3,4,5,6];
let iter = get_ref(&v, |x| x.iter().skip(1).take(2));

println!("{:?}", iter.collect::<Vec<_>>());
}
我创建了一些 static变量,然后将一些函数应用于其引用并获得结果。
它似乎完全正常。至少它可以成功编译。
现在,我尝试添加下一个抽象级别。而且事情变得奇怪了...
fn owned<'a, R>(owner: Vec<i32>, f: fn(&'a Vec<i32>) -> R)
where
R: 'a,
{
let _ = get_ref(&owner, f); // error occurs here
// `owner` does not live long enough.
}

// get_ref is the same as in the first example
fn get_ref<'a, R>(slice: &'a Vec<i32>, f: fn(&'a Vec<i32>) -> R) -> R
where
R: 'a,
{
f(slice)
}

fn main() {
let v = [1,2,3,4,5,6];
owned(v, |x| x.iter().skip(1).take(2));
}
对我来说,它看起来几乎是相同的代码。但是Rust无法编译它。我真的不明白为什么会这样,我应该如何重写我的代码进行编译。

最佳答案

想象一下,如果我决定使用定义为owned<'static, i32>(Vec<i32>, foo)的函数foo进行调用:

fn foo(vec: &'static Vec<i32>) -> i32 { ... }
owned开始,这满足了 i32: 'static的范围。但是,这意味着您必须具有静态引用才能调用 f,但是 owner不会永远存在,因为它在 owned的末尾被销毁了。
解决该问题的一种方法是使用以下方法:
fn owned<R>(owner: Vec<i32>, f: for<'a> fn(&'a Vec<i32>) -> R) {
let _ = get_ref(&owner, f);
}
它说 f必须在任何生存期内都可以被调用,而不仅仅是某些特定的生存期。但是,这样做的结果是 R不能从参数中借用,因为 R在比 'a更大的范围内声明。在保持通用名称不变的情况下,没有任何方法可以解决此问题。

这个答案来自我对URLO上 this thread的答复。

关于rust - 引用“静态生命周期不长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66294467/

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