簡體   English   中英

參考“靜態”的壽命不夠長?

[英]ref to 'static does not live long enough?

考慮下一個代碼:

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變量,然后將一些 function 應用於它的引用並得到結果。 它似乎工作得很好。 至少它成功編譯。

現在我正在嘗試添加下一個抽象級別。 事情變得越來越奇怪......

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 編譯失敗。 我真的不明白為什么會這樣,我應該如何重寫我的代碼來編譯。

想象一下,如果我決定調用 functionowned owned<'static, i32>(Vec<i32>, foo)並將foo定義為:

fn foo(vec: &'static Vec<i32>) -> i32 { ... }

這滿足了 own 的界限,因為owned i32: 'static 然而,這意味着你必須有一個owned引用來調用f ,但是owner不會永遠存在,因為它在 own 結束時被銷毀。

解決它的一種方法是使用以下方法:

fn owned<R>(owner: Vec<i32>, f: for<'a> fn(&'a Vec<i32>) -> R) {
    let _ = get_ref(&owner, f);
}

它說f必須可以在任何生命周期內調用,而不僅僅是某個特定的生命周期。 但是,這會導致R不能從參數中借用,因為R在比'a更大的 scope 中聲明。 在保持 generics 不變的同時,沒有任何方法可以解決這個問題。


這個答案取自我對 URLO 上的這個帖子的回復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM