[英]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
值,其中contents
由v
引用,我想返回的東西。
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.