[英]What is the difference between `&str` and `&'static str` in a static or const?
[英]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.