Memory management 不可变字符串与克隆

Memory management 不可变字符串与克隆,memory-management,rust,ownership,ownership-semantics,Memory Management,Rust,Ownership,Ownership Semantics,我的思维方式是保持我的Strings不变,成为真理的唯一来源。 当我把同样的想法带进Rust时,我发现我必须做很多克隆工作。 由于字符串不会更改,因此不需要进行所有克隆。 下面是一个这样和那样的例子 借阅似乎不是一种选择,因为我将不得不处理引用和它们的生命周期。我的下一个想法是使用类似于Rc或Cowstruct的东西。但是用类似于Rc的东西包装所有字符串感觉不自然。在我有限的生锈经验中,我从未见过任何公开的所有权/内存管理结构,即Rc和Cow。我很好奇一个经验丰富的Rust开发者如何处理这样的问

我的思维方式是保持我的
String
s不变,成为真理的唯一来源。 当我把同样的想法带进Rust时,我发现我必须做很多克隆工作。 由于
字符串
不会更改,因此不需要进行所有克隆。 下面是一个这样和那样的例子

借阅似乎不是一种选择,因为我将不得不处理引用和它们的生命周期。我的下一个想法是使用类似于
Rc
Cow
struct的东西。但是用类似于
Rc
的东西包装所有
字符串感觉不自然。在我有限的生锈经验中,我从未见过任何公开的所有权/内存管理结构,即
Rc
Cow
。我很好奇一个经验丰富的Rust开发者如何处理这样的问题

在Rust中,暴露所有权/内存管理结构(如
Rc
Cow
)实际上是自然的吗?我应该用切片吗

使用std::collections::HashSet;
#[导出(调试)]
枚举检查{
已知(字符串),
重复(字符串),
丢失(字符串),
未知(字符串)
}
fn main(){
已知_值:HashSet=[
“a.”to_string(),
“b”。to_string(),
“c.”to_string()]
.iter().cloned().collect();
让提供的_值=vec[
“a.”to_string(),
“b”。to_string(),
“z.”to_string(),
“b”。to_string()
];
让mut found=HashSet::new();
让mut检查_值:Vec=提供的_值。iter().cloned()
.地图(v){
如果已知_值。包含(&v){
如果找到。包含(&v){
检查::重复(v)
}否则{
找到。插入(v.clone());
检查::已知(v)
}
}否则{
检查::未知(v)
}
}).收集();
let missing=已知值。差异(&found);
检查\u值=缺少
.克隆()
.折叠(检查|u值,| mut cv,m|{
等速推送(检查:缺失(m));
个人简历
});
println!(“检查值:{:?}”,检查值);
}

根据我问题评论中的讨论,示例中所有不可变
字符串的克隆都是正确的。克隆是必要的,因为它通过所有权而不是其他语言中的引用来处理内存

充其量,在不使用
Rc
的情况下,我可以通过在
提供的\u值上使用移动语义来减少克隆

更新:一些有趣的阅读

Cow
在我的示例中不起作用,因为它涉及引用的借用
Rc
将是我必须使用的。在我的示例中,所有内容都必须转换为
Rc
,但我可以看到,这一切都可能通过封装隐藏起来


使用std::collections::HashSet;
使用std::rc::rc;
#[导出(调试)]
枚举检查{
已知(Rc),
副本(Rc),
失踪(Rc),
未知(Rc)
}
fn main(){
已知_值:HashSet=[
Rc::new(“a.to_string()),
Rc::new(“b”。to_string()),
Rc::new(“c.to_string())]
.iter().cloned().collect();
让提供的_值=vec[
Rc::new(“a.to_string()),
Rc::new(“b”。to_string()),
Rc::new(“z”。to_string()),
Rc::new(“b.”to_string())
];
让mut found=HashSet::new();
让mut检查_值:Vec=提供的_值。iter().cloned()
.地图(v){
如果已知_值。包含(&v){
如果找到。包含(&v){
检查::重复(v)
}否则{
找到。插入(v.clone());
检查::已知(v)
}
}否则{
检查::未知(v)
}
}).收集();
let missing=已知值。差异(&found);
检查\u值=缺少
.克隆()
.折叠(检查|u值,| mut cv,m|{
等速推送(检查:缺失(m));
个人简历
});
println!(“检查值:{:?}”,检查值);
}

根据我问题评论中的讨论,示例中所有不可变
字符串的克隆都是正确的。克隆是必要的,因为它通过所有权而不是其他语言中的引用来处理内存

充其量,在不使用
Rc
的情况下,我可以通过在
提供的\u值上使用移动语义来减少克隆

更新:一些有趣的阅读

Cow
在我的示例中不起作用,因为它涉及引用的借用
Rc
将是我必须使用的。在我的示例中,所有内容都必须转换为
Rc
,但我可以看到,这一切都可能通过封装隐藏起来


使用std::collections::HashSet;
使用std::rc::rc;
#[导出(调试)]
枚举检查{
已知(Rc),
副本(Rc),
失踪(Rc),
未知(Rc)
}
fn main(){
已知_值:HashSet=[
Rc::new(“a.to_string()),
Rc::new(“b”。to_string()),
Rc::new(“c.to_string())]
.iter().cloned().collect();
让提供的_值=vec[
Rc::new(“a.to_string()),
Rc::new(“b”。to_string()),
Rc::new(“z”。to_string()),
Rc::new(“b.”to_string())
];
让mut found=HashSet::new();
让mut检查_值:Vec=提供的_值。iter().cloned()
.地图(v){
如果已知_值。包含(&v){
如果找到。包含(&v){
检查::重复(v)
}否则{
找到。插入(v.clone());
检查::已知(v)
}
}否则{
检查::未知(v)
}
}).收集();
let missing=已知值。差异(&F)