楼主:
yam276 ('_')
2025-03-24 10:33:08: https://space.bilibili.com/361469957/lists/3902595
: 从入门到入门
1. 左值
Rust有类似C++的左值,即放在等号左侧的东西
包含:
(1) 变量,例如:a
(2) 解引用,例如::*a
(3) 变量的字段存取,例如:a.0 (tuple)、a.field (结构)
(4) 上述任何组合,例如:*((*a)[0].1)
2. 地址不可变
let num: &mut i32 = &mut v[2];
num是一个v[2]的可变引用,
但num本身没有let mut宣告,
因此他虽然是可变引用,但本体(指向的地址)不可变
类似C++的 int* const num
const放型态后代表地址不可变但地址上的数值可变
3. 释放权限
Rust编译器很聪明,会在编译阶段就判断一个引用最后使用之后释放权限
4. Flow权限
除了常见的Read、Write、Owner之外其实还有一个Flow权限,
fn first_or(strings: &Vec<String>, default: &String) -> &String {
if strings.len() > 0 {
&strings[0]
} else {
default
}
}
这不会过编译,因为编译器不知道返回的引用是谁
Rust不会管函数内容怎么写,但他会看签名符号。
以这个例子来说,因为不知道first_or返回的是谁的引用,
因此离开此function之后有可能释放到default,
而离开此function之后,如果后面使用到default的引用则出现不确定性,
这种情况不是不行,但需要生命周期参数来表达,不过目前还没学到。