首页 rust

语言基础篇

智能指针

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,但是注意规则
}

豆瓣链接:https://book.douban.com/subject/35447165/




文章评论

目录