首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >&str和&String的区别是什么?

&str和&String的区别是什么?
EN

Stack Overflow用户
提问于 2022-02-21 09:24:52
回答 1查看 275关注 0票数 2

我正在浏览微软的锈蚀教程这里,这是关于

实现copy_and_return函数,以便它返回插入到向量中的值的引用

解决方案给出了这里,但是它与我的不同,因为它使用&String作为返回类型,而我使用&str。

代码语言:javascript
复制
// 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()
}
代码语言:javascript
复制
// 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章也有帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-21 09:31:41

我想知道我的解决方案是否有什么问题,说明教程采取了另一种方式?

我不认为它本身有什么问题,您的函数名可能更匹配,这取决于它的解释:您应该复制并返回原件,还是复制并返回副本?你的是第一选择,他们的是第二。

它与生命周期无关,但这确实对程序行为产生了影响:在“正式”解决方案中,结果是对插入到Vec中的值的引用,这意味着只要向量是“活的”(至少假设向量没有被修改)。

如果您将value: &'a str替换为value: &'_ str (也就是“您不关心的一生,但与'a不同),则可以看出两者之间的差别:官方解决方案仍然编译,而您的解决方案不编译。

尽管需要注意的是,官员还是可以返回&'a str,而不管如何:

代码语言:javascript
复制
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()
}

官方的解决办法很难很好地解决。

代码语言:javascript
复制
vector.get(vector.len() - 1)

是一种复杂的写作方式

代码语言:javascript
复制
vector.last()

但我不能说,他们可能只是不想用高级的API或什么东西压倒读者。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71203874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档