diff --git a/content/post/082.rust-01/index.md b/content/post/082.rust-01/index.md index 0a92284..149cd1d 100644 --- a/content/post/082.rust-01/index.md +++ b/content/post/082.rust-01/index.md @@ -11,6 +11,8 @@ date: "2024-12-30T01:20:00+0800" {{< bilibili BV1BG6eYPE7L >}} +建议前往 B 站观看哦! + ## 课程笔记 ### Rust 简介 diff --git a/content/post/083.rust-02/index.md b/content/post/083.rust-02/index.md new file mode 100644 index 0000000..cf55735 --- /dev/null +++ b/content/post/083.rust-02/index.md @@ -0,0 +1,78 @@ +--- +title: "给 Golang 开发者的 Rust 私房菜 02 变量与可变性" +categories: [ "Rust" ] +tags: [ "rust" ] +draft: false +slug: "rust-tutorial-02" +date: "2024-12-30T16:34:00+0800" +--- + +## 视频 + +{{< bilibili BV1ZX63YqEFa >}} + +建议前往 B 站观看哦! + +## 课程笔记 + +### 使用 RustRover + +RustRover 是 JetBrains 专为 Rust 语言开发的独立 IDE,致力于提供专业的 Rust 开发环境。RustRover 源自多年来在 JetBrains IDE 中的 Rust 插件支持经验,具备完整的 Rust 功能支持,包括深度学习驱动的全行代码补全、改进的 Cargo 管理、强大的调试工具和数据库支持等功能,旨在优化开发者的 Rust 工作流。 + +RustRover 引入了灵活的许可模式:个人非商业用途可以免费使用,而商业用途则需购买付费许可。这种模式允许独立开发者免费使用专业级的 Rust 开发环境。此外,RustRover 还能与 JetBrains 的其他工具无缝集成,便于协作和版本控制,是适合团队和个人项目的理想选择。 + +### 变量声明与可变性 + +#### 变量声明的差异 + +在 Go 中,我们使用 `var` 关键字或 `:=` 简写来声明变量: + +```go +var name string = "Go" +age := 42 +``` + +最大的区别在于: + +1. Rust 默认所有变量都是不可变的(immutable) +2. 需要显式使用 `mut`关键字来声明可变变量 +3. Rust 具有强大的类型推导能力,通常不需要显式声明类型 + +而在 Rust 中,我们使用 let 关键字: + +```rust +let name = "Rust"; +let mut age = 42; +``` + +#### 变量重影(Shadowing) + +Rust 独特的特性之一是允许变量重影: + +```rust +let x = 5; + +let x = x + 1; + +{ + let x = x * 2; + println!("x 在当前作用域的值是: {x}"); +} + +println!("x 的值是: {x}"); +``` + +这与 Go 中的变量重声明是不同的概念,Rust 的重影允许我们复用变量名但可以改变类型: + +```rust +let text = "hello"; +let text = text.len(); // 从字符串变为数字 +``` + +#### 实践建议 + +作为 Go 开发者,需要特别注意: + +- 优先使用不可变变量,这是 Rust 的最佳实践 +- 当确实需要修改变量值时,再使用 `mut` 关键字 +- 合理利用变量重影特性可以让代码更清晰 diff --git a/content/post/084.rust-04/index.md b/content/post/084.rust-04/index.md new file mode 100644 index 0000000..f42cf59 --- /dev/null +++ b/content/post/084.rust-04/index.md @@ -0,0 +1,158 @@ +--- +title: "给 Golang 开发者的 Rust 私房菜 03 数据类型" +categories: [ "Rust" ] +tags: [ "rust" ] +draft: false +slug: "rust-tutorial-03" +date: "2024-12-30T16:36:00+0800" +--- + +## 视频 + +{{< bilibili BV1ZX63YqEMw >}} + +建议前往 B 站观看哦! + +## 课程笔记 + +### Rust 的数据类型概述 + +Rust 是一门静态类型语言,在编译时就会进行严格的类型检查。 + +Rust 的数据类型可以分为两大类: + +1. **标量类型(Scalar Types)**: + - 单个值,如整数、浮点数、布尔值、字符。 +2. **复合类型(Compound Types)**: + - 包含多个值的类型,如元组和数组。 + +与 Golang 对比: + +- Rust 的类型定义更加严格,默认不会隐式类型转换。 +- 更注重内存安全和性能优化。 + +### 标量类型 + +#### 整数类型 + +- **有符号整数(Signed):** `i8`, `i16`, `i32`, `i64`, `i128`, `isize` +- **无符号整数(Unsigned):** `u8`, `u16`, `u32`, `u64`, `u128`, `usize` + +`isize`和`usize`类型取决于运行程序的计算机的体系结构:如果使用 64 位体系结构,则为 64 位;如果使用 32 位体系结构,则为 32 位。 + +> 默认类型是 `i32`,因为它的性能较好。 + +##### 示例 + +```rust +fn main() { + let x: i32 = 10; + let y: u8 = 255; + println!("x: {}, y: {}", x, y); +} +``` + +溢出行为: + +- 调试模式:触发 panic。 +- 发布模式:会循环取值。 + +#### 浮点类型 + +- `f32`: 32 位浮点数 +- `f64`: 64 位浮点数(默认) + +##### 示例 + +```rust +fn main() { + let pi: f64 = 3.14159; + println!("Pi: {}", pi); +} +``` + +#### 布尔类型 + +- 类型为 `bool`。 +- 值为 `true` 或 `false`。 + +##### 示例 + +```rust +fn main() { + let is_rust_fun = true; + println!("Rust is fun: {}", is_rust_fun); +} +``` + +#### 字符类型 + +- 使用单引号定义。 +- 支持 Unicode,长度为 4 字节。 + +##### 示例 + +```rust +fn main() { + let emoji = '😊'; + println!("Emoji: {}", emoji); +} +``` + +### 复合类型 + +#### 元组(Tuple) + +- 可包含**多种不同类型**的值。 +- 元组的长度是**固定**的。 + +##### 示例 + +```rust +fn main() { + let tup: (i32, f64, u8) = (500, 6.4, 1); + let (x, y, z) = tup; // 解构元组 + println!("The value of y is: {}", y); +} +``` + +#### 数组(Array) + +- 固定长度,元素类型**必须相同**。 +- 与 Golang 的切片不同,Rust 的数组大小在编译期就确定。 + +##### 示例 + +```rust +fn main() { + // 类型推导 + let arr = [1, 2, 3]; + // 指定类型 + let arr: [i32; 3] = [1, 2, 3]; + + println!("Array: {:?}", arr); +} +``` + +### 类型转换 + +Rust 不支持隐式类型转换,必须显式转换。 + +- 使用 `as` 关键字进行类型转换。 + +##### 示例 + +```rust +fn main() { + let x = 10; + let y = x as f64 / 3.0; + println!("y: {}", y); +} +``` + +--- + +### 实践建议 + +- **优先使用类型推导**:Rust 的类型推导可以减少代码冗余。 +- **注意整数溢出**:调试模式下会 panic,发布模式下会循环取值。