作者yam276 (史莱哲林的优等生)
看板Marginalman
标题Re: [闲聊] Rust: 从入门到入门
时间Mon Mar 24 14:09:28 2025
: 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,不会复制内容
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.248.143.163 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Marginalman/M.1742796570.A.62A.html
※ 编辑: yam276 (60.248.143.163 台湾), 03/24/2025 14:09:55
1F:推 oin1104: 我哭了 大师 只剩我连c++都写不好了 03/24 14:10