我正在浏览微软的锈蚀教程这里,这是关于
实现
copy_and_return函数,以便它返回插入到向量中的值的引用
解决方案给出了这里,但是它与我的不同,因为它使用&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无法调整大小,字符串将动态分配/释放内存。因此,&str是直接指向字符串的备份存储的引用,而& String则是对“包装器”对象的引用。此外,&str还可以用于子字符串,即它们是片。A &String引用始终是整个字符串。
“锈书”的第4.3章也有帮助
发布于 2022-02-21 09:31:41
我想知道我的解决方案是否有什么问题,说明教程采取了另一种方式?
我不认为它本身有什么问题,您的函数名可能更匹配,这取决于它的解释:您应该复制并返回原件,还是复制并返回副本?你的是第一选择,他们的是第二。
它与生命周期无关,但这确实对程序行为产生了影响:在“正式”解决方案中,结果是对插入到Vec中的值的引用,这意味着只要向量是“活的”(至少假设向量没有被修改)。
如果您将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或什么东西压倒读者。
https://stackoverflow.com/questions/71203874
复制相似问题