楼主:
yam276 ('_')
2025-03-24 14:09:28: https://space.bilibili.com/361469957/lists/3902595
: 从入门到入门
1. 借用与生命周期
fn return_a_string -> &String {
let s = String::new();
&s
}
这段code编译错误,
因为&s这个return value作为借用者的生命周期大于s
你不能借用并使用已经不存在的东西
因此你可以:
fn return_a_string -> String {
let s = String::new();
s
}
不是借用,而是转移所有权,
这代表s指向的heap在离开之后仍然存在不会被回收
或是:
fn return_a_string() -> &'static str {
"Hello, world!"
}
静态变量代表存活于整个程式周期
还有一种C语言风格的解法:
fn return_a_string(s: &mut String)
{
s.replace_range(.., "Hello, World"); // ..代表修改全部
}
但很姆咪,除非你是C语言老害,不然别用
2. Rc与Arc
fn return_a_string -> Rc<String> {
let s = Rc::new(String::from("Hello, World");
Rc::clone(&s)
}
Rc与Arc类似C++的shared_ptr,
会有一个计数器来判断有几个引用,
引用数为-1才回收资料,
跟C++一样同样也有weak参考避免循环引用
let weak_ref = Rc::downgrade(&node);
3. clone与join
解决借用与所有权最快的方法是.clone()
但问题是.clone()有多余内存开销,
.join则是能用于容器与字串,
他可能会比.clone()有较少开销,
因为.clone()是完整复制,
而.join()是消耗把特定成员连起来的内存开销,
速度来说.clone()是O(n)而.join()则是O(n)+新长度计算
另外Rc这种东西的.clone()仅仅是增加借用counter,不会复制内容