语言基础篇
智能指针
BOX<T>
该指针是指向类型为T的堆内存分配值的智能指针
fn main() {
let x: Box<i32> = Box::new(5);
let y: i32 = *x;
println!("x: {}", x);
println!("y: {}", y);
}
就是泛型的指针
解引用
fn main() {
let x: Box<i32> = Box::new(5);
let y: &i32 = &x;
assert_eq!(5, *y);
}
struct Custom {
data: String,
}
impl Drop for Custom {
fn drop(&mut self) {
println!("Dropping Custom with data: {}", self.data);
}
}
fn main() {
let str1 = Custom { data: String::from("hello world")};
let str2 = Custom{ data: String::from("hello rust")};
println!("{}", str1.data);
println!("{}", str2.data);
}s
Rc<T>
有一些所有制是明确有多个所有者,例如一个图中的节点可能被多个边所同时拥有。
所以他会多一个计数
use std::rc::Rc;
fn main() {
let x = Rc::new(5);
println!("{:p} {}", x, Rc::strong_count(&x));
let y = x.clone();
println!("{:p} {}", y, Rc::strong_count(&x));
{
let z = Rc::clone(&x);
println!("{:p} {}", z, Rc::strong_count(&x));
}
// println!("{:p} {}", z, Rc::strong_count(&x));
println!("{:p} {}", x, Rc::strong_count(&x));
}
// 0x19253f2dd00 1
// 0x19253f2dd00 2
// 0x19253f2dd00 3
// 0x19253f2dd00 2
RefCell<T>
将不可变的(无mut)改变
use std::cell::RefCell;
fn main() {
let v: RefCell<Vec<i32>> = RefCell::new(vec![1, 2, 3]);
println!("{:?}", v.borrow());
v.borrow_mut().push(3);
println!("{:?}", v.borrow());
}
// [1, 2, 3]
// [1, 2, 3, 3]
注意,同一作用域只允许有多个Ref<T>
或一个RefMut<T>
use std::cell::RefCell;
use std::cell::Ref;
use std::cell::RefMut;
fn main() {
let v: RefCell<Vec<i32>> = RefCell::new(vec![1, 2, 3]);
let v_borrow: Ref<Vec<i32>> = v.borrow();
// 就是这里的Ref可以改为RefMut,但是注意规则
}