Rust
Ilqjx
当下很忧郁啊
展开
-
Rust Vec 源码分析
Vec 内存大小 24 字节,包括一个指向堆上的 ptr,一个 cap,一个 len,每个都是 8 字节大小的 u64。2 扩容以 2 的 n 次幂的方式进行扩容,在第一次扩容的时候会有些特殊 (一个小优化)。原创 2022-06-12 13:34:18 · 482 阅读 · 0 评论 -
Rust HashMap 源码分析
Rust HashMap 源码分析1 HashMap 数据结构1 HashMap 数据结构use hashbrown::hash_map as base;#[derive(Clone)]pub struct RandomState { k0: u64, k1: u64,}pub struct HashMap<K, V, S = RandomState> { base: base::HashMap<K, V, S>,}HashMap 有三个原创 2022-06-03 18:13:07 · 719 阅读 · 0 评论 -
Rust impl Trait和dyn Trait
impl Trait:静态分发dyn Trait:动态分发静态分发:在编译期就确定了具体返回类型,函数只能返回一种类型。动态分发:在运行时才能确定具体返回类型,函数可以返回多种类型。Trait Object:指向trait的指针,假设Animal是一个triait,那么&Animal和Box<Animal>都是一种Trait Object。胖指针:用于指代动态大小类型(DST)的引用和原始指针(切片或特征对象)。胖指针包含一个指针以及一些使DST完成(例如长度)的信息。示例代原创 2022-03-22 17:38:11 · 1753 阅读 · 0 评论 -
Rust 将泛型转换为具体类型
可以考虑是否能用enum替代use std::any::Any;trait Trait { fn test<T: Trait + Any>(v: T) -> Self;}#[derive(Clone)]struct Special;impl Trait for Special { fn test<T: Trait + Any>(v: T) -> Self { let any = &v as &dyn Any原创 2022-02-11 12:57:12 · 1114 阅读 · 0 评论 -
Rust RadixTree
github: https://github.com/Ilqjx/radixtreeuse radixtree::{Node, Method};fn main() { let mut tree = Node::new(); tree.insert(Method::GET, "/hello", "hello"); tree.insert(Method::GET, "/user/$id", "user"); tree.insert(Method::GET, "/image/原创 2022-01-28 16:53:09 · 585 阅读 · 0 评论 -
Rust 标准库中的RwLock和tokio中的区别
标准库中的锁定策略取决于操作系统的实现:1.Windows和macOS,读者和作家公平排队。2.Linux,读者优先,作家会出现饥饿现象。tokio中的锁定策略是读者和作家公平排队,与操作系统无关。还有最重要的一点,tokio的RwLock在挂起的时候,会让出执行权,标准库的不会。...原创 2022-01-19 16:34:24 · 703 阅读 · 0 评论 -
Rust 内部可变性之UnsafeCell
UnsafeCell是构建内部可变性Cell、RefCell、Mutex和RwLock的基础。UnsafeCell在文档中被定义为Rust内部可变性的核心原语。#[lang = "unsafe_cell"]#[stable(feature = "rust1", since = "1.0.0")]#[repr(transparent)]#[repr(no_niche)] // rust-lang/rust#68303.pub struct UnsafeCell<T: ?Sized> {原创 2022-01-19 15:11:29 · 771 阅读 · 0 评论 -
Rust 内部可变性之线程安全
线程安全的内部可变性包括Mutex、RwLock和Atomic*1.Mutex一次只允许一个线程,可以被认为只提供可变引用。2.RwLock允许多个读者或一个作者3.Arc是线程安全版本的Rc4.在Rust中,我们锁定的是数据,而不是代码。Atomic类型依赖于汇编指令来防止数据竞争AtomicBool 布尔类型AtomicSize 有符号整数类型AtomicUsize 无符号整数类型AtomicPtr 原始指针类型多线程中使用Arc<RwLock<T>>代替Rc原创 2022-01-19 10:57:54 · 940 阅读 · 0 评论 -
Rust 内部可变性之Cell和RefCell
内部可变性是指当你有一个不可变引用,但是你可以改变内部值。Cell和RefCell可以实现内部可变性:1.Cell包装Copy值,并且没有借用检查;2.RefCell包装任何类型的值,有运行时借用检查,并且需要用borrow或borrow_mut锁定,分别提供一个不可变或可变引用;3.Cell和RefCell都不是线程安全的。Cell和RefCell的区别:pub struct Cell<T: ?Sized> { value: UnsafeCell<T>,}原创 2022-01-18 16:29:17 · 1273 阅读 · 0 评论 -
Rust 全局变量
全局不可变变量use std::collections::HashMap;use lazy_static::lazy_static;lazy_static! { static ref MAP: HashMap<u32, &'static str> = { let mut map = HashMap::new(); map.insert(1, "a"); map.insert(2, "b"); map.inse原创 2022-01-17 21:18:36 · 2218 阅读 · 0 评论 -
Rust 文件
创建文件use std::fs::{self, File};use std::io::{self, Write};use std::path::Path;/// 支持相对路径和绝对路径/// 相对路径是相对于当前 crate 所在的目录fn create_file(path: &str) -> io::Result<File> { let file = File::create(path); if file.is_err() { if原创 2022-01-13 20:09:11 · 1442 阅读 · 0 评论 -
Rust 时间
SystemTime获取时间对应的秒/毫秒/微秒/纳秒use std::time::{UNIX_EPOCH, SystemTime};fn main() { let now = SystemTime::now().duration_since(UNIX_EPOCH).unwrap(); let time = now.as_secs(); let time = now.as_millis(); let time = now.as_micros(); let ti原创 2022-01-10 21:55:32 · 2068 阅读 · 1 评论 -
Rust Actix Web 中关于 HttpServer 的一点思考
1.为什么App::new().app_data(data.clone())中的data需要调用clone()?2.为什么app闭包需要加上move关键字?我的思考是这样的,如有不对,欢迎指出。第一个问题:因为HttpServer::new()需要的闭包类型是Fn,如果不调用clone(),则是FnOnce,因为app_data(self)函数需要获取所有权。第二个问题:在这之前,我们需要知道一点,闭包只是定义了代码,并不是执行。当app闭包执行的时候,data应该存在,观察代码其实data一直原创 2022-01-09 16:19:27 · 544 阅读 · 0 评论 -
Rust 闭包
Rust的闭包类型分为三种:1.Fn2.FnMut3.FnOnce不同之处:1.它们的调用方法分别采用&self、&mut self和self,这意味着Fn对其捕获具有不可变的访问权限,FnMut获得可变的访问权限,FnOnce可以获得所有权。2.Fn和FnMut类型的闭包可以执行多次,而FnOnce类型的闭包只能执行一次。move关键字:1.如果没有实现Copy,就是move语义,会发生移动。2.如果实现Copy,则是copy语义,会发生拷贝。值得注意的是move与闭包原创 2022-01-09 14:46:48 · 1794 阅读 · 0 评论 -
Rust 程序设计语言 web server (tokio)
Rust 程序设计语言 web server1 web server 源码2 web server (tokio)1 web server 源码// src/bin/main.rsuse std::fs;use std::io::prelude::*;use std::net::{TcpListener, TcpStream};use web_server::ThreadPool;fn main() { let listener = TcpListener::bind("127.0.原创 2021-12-20 22:45:41 · 688 阅读 · 1 评论