声明Module
如果在main.rs/lib.rs中使用mod,比如mod toys,则crate会在以下位置寻找对应的模块文件:
- main.rs的同级目录内寻找toys.rs。
- src/toys/mod.rs,这表示toys模块的声明
如果不在上述位置使用模块,则在使用模块的文件的同级目录进行查找。
Trait作为成员对象
声明trait,参数添加&self表示调用者自身,这是为了保证trait类型安全(这样可以使trait作为一个“对象”来使用),例如这样:
pub trait TState {
fn on_enter(&self);
fn on_update(&self);
fn on_leave(&self);
}
要使得一个trait成为结构体中的成员,这个trait必须是“类型安全”的。
pub struct ProcedureComponent{
//必须使用Box指针来指向一个trait对象,因为trait是一个未知大小的类型,而Box指针是一个固定大小的类型
//并且使用dyn关键字来声明trait对象,这表示这是一个运行时动态分发的trait对象
//TState是一个trait对象
_current_procedure:Box<dyn TState>,
}
Some,Result,和Option
Option
Result<T, E>:表示一个可能成功(Ok(T))或失败(Err(E))的操作。
Rust中返回可变引用
pub struct EventComponent {
_event_map:HashMap<i32,Vec<fn()>>
}
let mut call_back_vec = self._event_map.get(&event_id).unwrap() //error
let call_back_vec = self._event_map.get_mut(&event_id).unwrap() //ok
会报错的原因是 get 方法返回的是一个不可变引用(&Vec<fn()>),而你试图将其绑定到一个可变变量 mut,这会导致编译错误。 而 不会报错的原因是 get_mut 方法返回的是一个可变引用(&mut Vec<fn()>),这允许你对返回的引用进行修改。 get 返回不可变引用,不能绑定到 mut 变量。 get_mut 返回可变引用,可以绑定到 mut 变量并进行修改。
实例函数的所有权问题
在 Rust 中,self 和 &self 作为方法的参数有以下区别: self:
- 表示方法获取所有权。
- 调用该方法时,所有权会被转移到方法内部,调用者将不再拥有该实例。
- 适用于需要消耗实例的场景。
&self:
- 表示方法获取不可变引用。
- 调用该方法时,调用者仍然保留对实例的所有权。
- 适用于只需要读取实例数据而不修改的场景。
struct MyStruct {
value: i32,
}
impl MyStruct {
// 获取所有权
fn consume(self) {
println!("Consuming MyStruct with value: {}", self.value);
}
// 获取不可变引用
fn read(&self) {
println!("Reading MyStruct with value: {}", self.value);
}
}
fn main() {
let my_struct = MyStruct { value: 10 };
// 调用不可变引用方法
my_struct.read();
// 调用获取所有权方法
my_struct.consume();
// 此时 my_struct 已被消耗,不能再使用
}
调试和工具链
Windows 上安装 Rust 需要有 C++
环境,以下为安装的两种方式:
1. x86_64-pc-windows-msvc
(官方推荐)
2、x86_64-pc-windows-gnu
调试时可以选择启用MSVC工具链或GNU工具链
【rustup toolchain list】查看当前的工具链
【rustup default stable-gnu】将默认启用的工具链切换为GNU
没有安装GNU工具链的话需要先安装,注意,如果启用GNU工具链,则需要安装GCC编译器
安装和使用GNU工具链:
【rustup toolchain install stable-x86_64-pc-windows-gnu】
【rustup default stable-x86_64-pc-windows-gnu】
安装和使用MSVC工具链:
【rustup toolchain install stable-x86_64-pc-windows-msvc】 【rustup default stable-x86_64-pc-windows-msvc】