本系列是学习 Rust 的学习笔记,本编主要对 https://cheats.rs/ 的语法速查表进行翻译学习
为非所有者内存赋予访问权限。另请参见 泛型 & 约束部分。
示例 | 说明 |
---|---|
&S | 共享引用 (可容纳 任意 &s )。 |
~~~~
&[S] | 特殊的切片引用,包含 (地址 , 长度 )。 |
~~~~
&str | 特殊的字符串切片引用,包含 (地址 , 长度 )。 |
~~~~
&mut S | 允许可变性的独占引用 (也有 &mut [S] , &mut dyn S , …)。 |
~~~~
&dyn T | 特殊的 trait 对象 引用,包含 (地址 , 虚函数表 )。 |
&s | 共享借用 (例如,s 的地址、长度、虚函数表等,就像 0x1234 )。 |
~~~~
&mut s | 允许可变性的独占借用。 |
*const S | 不可变的 原始指针类型,没有内存安全性。 |
~~~~
*mut S | 可变的原始指针类型,没有内存安全性。 |
~~~~
&raw const s | 创建原始指针而不通过引用;c. ptr:addr_of!() 🚧 🝖 |
~~~~
&raw mut s | 同上,但是可变的。🚧 需要原始指针来处理不对齐的、紧凑的字段。🝖 |
ref s | 绑定引用,使绑定为引用类型。🗑️ |
~~~~
let ref r = s; | 等同于 let r = &s 。 |
~~~~
let S { ref mut x } = s; | 可变引用绑定 (let x = &mut s.x ),简写的解构版本。 |
*r | 解引用 引用 r 来访问它指向的内容。 |
~~~~
*r = s; | 如果 r 是可变引用,将 s 移动或复制到目标内存。 |
~~~~
s = *r; | 使 s 成为 r 引用的内容的副本,如果它是 Copy 的话。 |
~~~~
s = *r; | 如果 *r 不是 Copy ,则不起作用 🛑,因为这会移动并留下空位。 |
~~~~
s = *my_box; | 对于 Box 的特殊情况,如果它不是 Copy ,也可以移出 Box 的内容。 |
'a | 生命周期参数,用于静态分析流程的持续时间。 |
~~~~
&'a S | 只接受持有 s 的地址;地址的存在期至少为 'a 。 |
~~~~
&'a mut S | 相同,但允许地址内容被更改。 |
~~~~
struct S<'a> {} | 表示 S 将包含具有生命周期 'a 的地址。 S 的创建者决定 'a 。 |
~~~~
trait T<'a> {} | 表示 S 可能包含地址的 impl T for S 。 |
~~~~
fn f<'a>(t: &'a T) | 函数的情况相同。调用者决定 'a 。 |
'static | 特殊的生命周期,持续整个程序执行期间。 |
引用 & 指针简单示例:
-
引用和借用:允许对数据进行非所有者访问,而不移动所有权。示例:
let s = String::from("hello"); let reference = &s;
-
原始指针类型:不安全的裸指针,不提供任何安全保证。示例:
let ptr: *const i32 = &10;
-
生命周期参数:用于指定引用的有效范围,帮助编译器进行借用检查。示例:
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { if x.len() > y.len() { x } else { y } }
-
绑定引用:将引用绑定到变量上,可以通过解构语法轻松地访问引用的内部字段。示例:
let s = String::from("hello"); let ref reference = s;
-
生命周期参数化的结构体和 trait:允许在结构体定义或 trait 实现中引入生命周期参数,用于指定引用的有效范围。示例:
struct StrWrapper<'a> { s: &'a str, }
-
静态生命周期:特殊的生命周期,持续整个程序执行期间。示例:
static GLOBAL_VAR: i32 = 100;