簡體   English   中英

在 Rust 中為靜態生命周期的懸空引用和建議而苦苦掙扎

[英]Struggling with dangling references and suggestions for static lifetimes in Rust

原諒我的新手 Rust-ing。 我寫了一個函數來清理文件,並驗證了該函數的邏輯似乎沒問題。 然后我想將此函數從 main 重命名為輔助函數。 我知道我可以在主函數中保留一些 IO 的東西,但是為了好玩,假設我想在輔助函數中保留下面的所有代碼。

如果我們將返回類型更改為Result<(), std::io::Error>並將最后一行修改為Ok(())則下面的代碼將被編譯。 然而,這段代碼沒有。 編譯器建議我將&str修改為&'static str ,盡管這種更改似乎沒有幫助,因為編譯器然后說“E0277, main只能返回實現終止的類型”

在這一點上,我開始在對如何避免懸空引用的理解不足的情況下開始崩潰。

fn main() -> Result<Vec<&str>, std::io::Error> {
    let file = File::open("22names.txt")?;
    let mut buf_reader = BufReader::new(file);
    let mut contents = String::new();
    buf_reader.read_to_string(&mut contents)?;

    contents.retain(|c| c != '"');
    let v: Vec<&str> = contents.split(',').collect();

    println!("first 10 indices of v are: {:?}", &v[..10]);

    Ok(v)
}

編輯:如果我修改上面的內容,將 main 重命名為任意函數f ,並從一個新的 main 函數調用f並將結果分配給一個變量, let v = f()我得到以下錯誤,這是由於contents正在超出范圍。 我如何將contents保持在范圍內,或者更確切地說,是指向它的向量v 錯誤[E0515]:無法返回引用局部變量contents值,其中contentsv引用,我想返回的東西。

main 函數是程序的入口點。 由於這個函數是第一個被執行的函數,沒有其他函數調用過它。 您的程序在 main 函數返回后退出。 main 函數的返回值用於確定程序的退出狀態。 因此,沒有其他函數可以使用main的返回值。 我建議重命名您的功能。

另一個錯誤發生是因為您返回字符串的切片。 Content包含您從文件中讀取的數據,而v僅包含對這些數據的引用。 content超出范圍后,內存將被釋放。 這將導致v包含無效指針。 編譯器不允許這樣做。

您可以返回String而不是&str String擁有底層數據。 為此,您應該將函數簽名更改為fn helper() -> Result<Vec<String>, std::io::Error> 您需要將您的Vec<&str>Vec<String> 你可以使用String::from那樣:

let v: Vec<String> = contents.split(',').map(String::from).collect();

暫無
暫無

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

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