簡體   English   中英

&str 和 &String 有什么區別

[英]What is the difference between &str and &String

我在這里瀏覽了 Microsoft 的 Rust 教程,它是關於

實現copy_and_return function 以便它返回對插入向量中的值的引用

這里給出了解決方案,但是和我的不同的是它使用&String作為返回類型,而我使用的是&str。

// standard solution
fn copy_and_return<'a>(vector: &'a mut Vec<String>, value: &'a str) -> &'a String {
    vector.push(String::from(value));
    vector.get(vector.len() - 1).unwrap()
}
// my solution
fn copy_and_return<'a>(vector: &'a mut Vec<String>, value: &'a str) -> &'a str {
    vector.push(String::from(value));
    return value; // simply return value
}

fn main() {
    let name1 = "Joe";
    let name2 = "Chris";
    let name3 = "Anne";

    let mut names = Vec::new();

    assert_eq!("Joe", copy_and_return(&mut names, &name1));
    assert_eq!("Chris", copy_and_return(&mut names, &name2));
    assert_eq!("Anne", copy_and_return(&mut names, &name3));

    assert_eq!(
        names,
        vec!["Joe".to_string(), "Chris".to_string(), "Anne".to_string()]
    )
}

除了返回類型之外,我的和標准方案的另一個區別是我只是簡單地返回了參數value ,而標准方案使用了復雜的方式vector.get(vector.len() - 1).unwrap()

我想知道教程采用另一種方式的解決方案是否有任何問題?


雖然 @Masklinn 為我的問題提供了很好的答案,但它有點特定於我給出的示例,但沒有直接解決標題What is the difference between &str and &String
我發現這個討論非常有用:

基本上,一個String包裝和管理一個動態分配的 str 作為后備存儲。 由於 str 無法調整大小,String 將動態分配/取消分配 memory。因此, &str是對 String 后備存儲的直接引用,而 &String 是對“包裝器”object 的引用。另外,&str 可用於子字符串,即它們是切片。 &String 總是引用整個字符串。

Rust書的第4.3章也有幫助

我想知道教程采用另一種方式的解決方案是否有任何問題?

我不認為本身有什么問題,您的名稱甚至可能更匹配 function 名稱,具體取決於它的解釋方式:您應該復制並返回原件,還是復制並返回副本? 你的是第一選擇,他們的是第二選擇。

它與生命周期無關,但這確實對程序行為產生了影響:在“官方”解決方案中,結果是對插入Vec的值的引用,這意味着只要 vector 它將“有效”是(至少假設向量沒有被修改)。

如果將value: &'a str替換為value: &'_ str (又名“你不關心但與'a不同的生命周期”),你會看到不同之處:官方解決方案仍然可以編譯,你的不會。

盡管請注意,無論如何,官方也可以返回&'a str

fn copy_and_return<'a>(vector: &'a mut Vec<String>, value: &'_ str) -> &'a str {
    vector.push(String::from(value));
    vector.get(vector.len() - 1).unwrap()
}

官方解決方案很難通過例如

vector.get(vector.len() - 1)

是一種復雜的寫作方式

vector.last()

但可能他們只是不想用高級 API 之類的東西讓讀者不知所措,我不能說。

暫無
暫無

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

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