Rust

Rust Langusge

Posted by JBNRZ on 2023-01-05
Estimated Reading Time 3 Minutes
Words 696 In Total
Viewed Times

rust

Command line

rustup

  • rustc --version
  • rustup update
  • rustup self uninstall
  • rustup doc

Clion config

  • Install plugin: Rust
    1.png

Hello world

1
2
3
fn main() {
println!("hello wolrd");
}
  • linker link.exe not found

    rustup toolchain install stable-x86_64-pc-windows-gnu
    rustup default stable-x86_64-pc-windows-gnu

Cargo

  • cargo new {project}
  • cargo run
  • cargo update
  • cargo build

    develop

  • cargo build --release

    produce

Variable

  • Int

    2.png
    3.png

  • Float

    f32
    f64

  • Bool

    true
    false

  • Char
  • Tuple
  • Array

Move

1
2
3
4
5
6
7
let mut s = String::from("hello");
s.push_str(", world");
let s2 = s; // 此刻 s 失效 shallow copy
// println!("{s}");
// error[E0382]: borrow of moved value: `s`
// let s2 = s.clone();
println!("{s2}");

String 在内存中大小未知,未实现 copy trait
当 s2 = s 时,s 作用域结束

Copy trait

  • int
  • bool
  • char
  • float
  • Tuple[all copy trait]

    [int, float, …]
    [int, String] X

Reference

  • 一个可变的引用
  • 多个不可变的引用
  • 引用必须持续有效

Slice

  • 不持有所有权

Construct

1
2
3
4
5
6
struct Person {
name: String,
age: u32,
email: String,
activate: bool
}

字段初始化简写语法(field init shorthand)

1
2
3
4
5
6
Person {
name,
age,
activate: true,
email: String::from("test@example.com")
}

从已有结构生辰新结构

1
2
3
4
5
6
7
8
9
10
11
12
let alice = Person {
name: String::from("Alice"),
age: 30,
email: String::from("admin@example.com"),
activate: true
};
let arc = Person {
name: String::from("Arc"),
age: 15,
..bob
// 语法指定了剩余未显式设置值的字段应有与给定实例对应字段相同的值。
};

使用没有命名字段的元组结构体来创建不同的类型

1
struct Color(i32, i32, i32);

结构体数据的所有权

在示例 5-1 中的 User 结构体的定义中,我们使用了自身拥有所有权的 String 类型而不是 &str 字符串 slice 类型。这是一个有意而为之的选择,因为我们想要这个结构体拥有它所有的数据,为此只要整个结构体是有效的话其数据也是有效的。

可以使结构体存储被其他对象拥有的数据的引用,不过这么做的话需要用上 生命周期lifetimes),这是一个第十章会讨论的 Rust 功能。生命周期确保结构体引用的数据有效性跟结构体本身保持一致。如果你尝试在结构体中存储一个引用而不指定生命周期将是无效的,比如这样:

文件名: src/main.rs

struct User { username: &str, email: &str, sign_in_count: u64, active: bool, }

fn main() {
let user1 = User {
email: someone@example.com,
username: “someusername123”,
active: true,
sign_in_count: 1,
};
}

编译器会抱怨它需要生命周期标识符:

error[E0106]: missing lifetime specifier --> | 2 | username: &str, | ^ expected lifetime parameter

error[E0106]: missing lifetime specifier
–>
|
3 | email: &str,
| ^ expected lifetime parameter

第十章会讲到如何修复这个问题以便在结构体中存储引用,不过现在,我们会使用像 String 这类拥有所有权的类型来替代 &str 这样的引用以修正这个错误。


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !