Rust 的 move 和 C++ 的 std::move

Rust 的 move 和 C++ 的 std::move 在表面上看有些相似之处,因为它们都涉及到数据或资源的转移。然而,它们在设计理念、实现方式以及它们在各自语言中所扮演的角色上有着根本的区别。

Rust 中的 Move 语义

所有权转移
Rust 中的 move 语义是其所有权系统的核心部分。当一个值从一个变量移动到另一个变量时,原始变量不再有权访问该值。这避免了悬垂指针和数据竞争等问题。
编译时检查
Rust 的编译器在编译时就会检查所有权、借用和生命周期规则,确保内存安全而无需运行时开销。
自动控制
Rust 的 move 语义是通过编译器自动实现的,不需要程序员提供特殊的代码来支持 move 语义。

C++ 中的 Move 语义

资源转移
C++11 引入了 move 语义,主要用于优化资源管理,减少不必要的对象复制。通过 std::move ,可以将一个对象的状态或资源转移到另一个对象,原对象则处于一个有效但未定义的状态。
标准库的支持
C++ 的 move 语义与其标准库紧密结合,许多容器和算法都对 move 语义进行了优化。
手动控制
与 Rust 的自动和严格的所有权模型不同,C++ 程序员需要更多地手动管理资源和使用 move 语义,这提供了灵活性但也增加了错误的可能性。

具体来讲,C++ 的 move 语义是通过类的『移动构造函数』和『移动赋值运算符』来提供支持的。

发布我的第一个 Crate: django-auth

今天发布了我的第一个 crate: django-auth, 虽然是一个非常简单的 crate, 但麻雀虽小,五脏俱全,API 文档、测试用例、doc test 等一个都不能少 😎。

先简单介绍一下这个库,然后再介绍一下在 crates.io 上发布 crate 的流程。

Rust 中的特征 (Trait)

Trait 初探

trait 是 Rust 中用来定义共享行为的抽象机制,和 Java 的 interface, Swift 的 protocol 等接口抽象机制有点类似。

定义一个 trait 很简单:

1
2
3

                
                    
                
            
        
            

Rust 中的 | (竖线) 符号

Rust 中的 | 用途比较多,这里做一个简单的整理。

模式匹配中的“或”模式 (Pattern Alternatives)

在模式匹配(如 match 语句或 if let 表达式)中, | 可以用来表示多个模式的组合:

Doom Emacs 的基本用法

安装

1
2
git clone --depth 1 https://github.com/doomemacs/doomemacs ~/.config/emacs
~/.config/emacs/bin/doom install

环境变量

执行 doom env 命令,可以 dump 一份当前的 shell 环境变量,Doom 启动时会加载该环境变量。如果你的环境变量配置发生变化(例如修改了 PATH 配置),则应该重新执行一次该命令。