rust 生命周期
分配在堆和栈上的内存有其各自的作用域,它们的生命周期是动态的。
全局变量、静态变量、字符串字面量、代码等内容,在编译时,会被编译到可执行文件中的 BSS/Data/RoData/Text 段,然后在加载时,装入内存。因而,它们的生命周期和进程的生命周期一致,所以是静态的。
所以,函数指针的生命周期也是静态的,因为函数在 Text 段中,只要进程活着,其内存一直存在。
生命周期标注的目的是,在参数和返回值之间建立联系或者约束。调用函数时,传入的参数的生命周期需要大于等于(outlive)标注的生命周期。
在 Rust 中,除非显式地做 Box::leak() / Box::into_raw() / ManualDrop 等动作,一般来说,堆内存的生命周期,会默认和其栈内存的生命周期绑定在一起。
在这种默认情况下,在每个函数的作用域中,编译器就可以对比值和其引用的生命周期,来确保“引用的生命周期不超出值的生命周期”。
根据所有权规则,值的生命周期可以确认,它可以一直存活到所有者离开作用域;而引用的生命周期不能超过值的生命周期。在同一个作用域下,这是显而易见的。然而,当发生函数调用时, ...
rust 所有权
总结
所有权:一个值只能被一个变量所拥有,且同一时刻只能有一个所有者,当所有者离开作用域,其拥有的值被丢弃,内存得到释放。
Move 语义:赋值或者传参会导致值 Move,所有权被转移,一旦所有权转移,之前的变量就不能访问。
Copy 语义:如果值实现了 Copy trait,那么赋值或传参会使用 Copy 语义,相应的值会被按位拷贝(浅拷贝),产生新的值。
规则:
一个值在同一时刻只有一个所有者。当所有者离开作用域,其拥有的值会被丢弃。赋值或者传参会导致值 Move,所有权被转移,一旦所有权转移,之前的变量就不能访问。
如果值实现了 Copy trait,那么赋值或传参会使用 Copy 语义,相应的值会被按位拷贝,产生新的值。
一个值可以有多个只读引用。
一个值可以有唯一一个活跃的可变引用。可变引用(写)和只读引用(读)是互斥的关系,就像并发下数据的读写互斥那样。
引用的生命周期不能超出值的生命周期。
变量在函数调用时发生了什么1234567891011121314151617fn main() { let data = vec![10, 42, 9, 8] ...
rust 初学
概览基本概念
Rust 定义变量、函数和数据结构
控制流程
例子下载 url 为 md 文件在 terminal 输入 cargo run -- https://www.rust-lang.org rust.md
即是把 https://www.rust-lang.org 下载到 rust.md
Cargo.toml
12345678910[package]name = "scrape_url"version = "0.1.0"edition = "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]reqwest = { version = "0.11", features = ['blocking'] }html2md = "0.2"
main.rs
12345 ...
js 实用工具
deleteNillValueFromObject删除undefined,null,[],{}从Object
12345678const deleteNillValueFromObject = obj => { // {a:1, b: 2, c: null, d: []} const noEmpty = (val, key) => { return !(R.isNil(val) || R.isEmpty(val)); }; const removeEmptyFromObject = R.curry(R.pickBy(noEmpty)); return removeEmptyFromObject(obj);};
树莓派初试
环境国内镜像debian (bullseye)
编辑 /etc/apt/sources.list 文件,删除原文件所有内容,用以下内容取代
12deb http://mirrors.aliyun.com/raspbian/raspbian/ bullseye main non-free contribdeb-src http://mirrors.aliyun.com/raspbian/raspbian/ bullseye main non-free contrib
编辑 /etc/apt/sources.list.d/raspi.list 文件,删除原文件所有内容,用以下内容取代:
12deb http://mirrors.aliyun.com/raspberrypi/ bullseye main
docker 搭建 home assistant12345678docker run -d \ --name homeassistant \ --privileged \ --restart=unless-stopped \ -e TZ=MY_TIME_ZONE \ -v /P ...
github action 私钥部署
生成公私钥1ssh-keygen -t rsa -b 4096 -C "$(git config user.email)" -f github-deploy-key -N ""
目录中生成两个文件:
github-deploy-key.pub — 公钥文件
github-deploy-key — 私钥文件
公钥和私钥切记要添加到 .gitignore 中!!!
GitHub 添加公钥在 GitHub 中博客工程中按照 Settings->Deploy keys->Add deploy key 找到对应的页面,然后进行公钥添加。该页面中 Title 自定义即可,Key 中添加 github-deploy-key.pub 文件中的内容。
切记要勾选 Allow write access,否则会出现无法部署的情况。
GitHub 添加私钥在 GitHub 中博客工程中按照 Settings->Secrets->Add a new secrets 找到对应的页面,然后进行私钥添加。该页面中 Name 自定义即可,Value ...
docker 安装问题
docker enginedocker engine
docker engine 安装后执行 sudo docker run hello-world
报错
123╰─ sudo docker run hello-worlddocker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.See 'docker run --help'.
解决办法123sudo service docker statussudo service docker start
curl 挂代理docker compose
1curl --socks5 172.28.128.1:7890
函数式入门笔记1
引用
JavaScript 函数式编程(一)
JavaScript 函数式编程(二)
JavaScript 函数式编程(三)
怎么学习函数式编程?
学习 Computational Trinitarianism 应按照怎样的学习路径
Learn You a Haskell for Great Good!
Composing Software: The Book
类型论驿站写作计划
纯函数纯函数的定义是,对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环境的状态
函数的柯里化传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。
事实上柯里化是一种“预加载”函数的方法,通过传递较少的参数,得到一个已经记住了这些参数的新函数,某种意义上讲,这是一种对参数的“缓存”,是一种非常高效的编写函数的方法:
1234567891011121314151617import { curry } from "lodash";//首先柯里化两个纯函数var match = curry((reg, str) => str. ...
webpack 笔记
Webpack 核心原理一文吃透 Webpack 核心原理
主体框架
核心流程解析
初始化阶段
初始化参数:从配置文件、 配置对象、Shell 参数中读取,与默认配置结合得出最终的参数
创建编译器对象:用上一步得到的参数创建 Compiler 对象
初始化编译环境:包括注入内置插件、注册各种模块工厂、初始化 RuleSet 集合、加载配置的插件等
开始编译:执行 Compiler 对象的 run 方法
确定入口:根据配置中的 entry 找出所有的入口文件,调用 compilation.addEntry 将入口文件转换为 dependence 对象
构建阶段
编译模块(make):根据 entry 对应的 dependence 创建 module 对象,调用 loader 将模块转译为标准 JS 内容,调用 JS 解释器将内容转换为 AST 对象,从中找出该模块依赖的模块,再 递归 本步骤直到所有入口依赖的文件都经过了本步骤的处理
完成模块编译:上一步递归处理所有能触达到的模块后,得到了每个模块被翻译后的内容以及它们之间的 依赖关系图
生成阶段
输出资源(seal):根据入口和 ...
react 源码-迷你 react
迷你 react迷你 react 和真正的源码有哪些区别呢
在 render 阶段我们遍历了整颗 Fiber 树,在源码中如果节点什么都没改变会命中优化的逻辑,然后跳过这个节点的遍历commit 我们也遍历了整颗 Fiber 树,源码中只遍历带有 effect 的 Fiber 节点,也就是遍历 effectList每次遍历的时候我们都是新建节点,源码中某些条件会复用节点没有用到优先级
第一步:渲染器和入口函数12345678910111213141516171819202122const React = { createElement, render,};const container = document.getElementById("root");const updateValue = (e) => { reRender(e.target.value);};const reRender = (value) => { const element = ( <div> ...