命名字段结构体
struct GrayscaleMap {
pixels: Vec<u8>,
size: (usize, usize)
}
结构体是驼峰命名法 , 字段和方法、文件夹名称使用蛇形拼写法
如果局部变量或参数与字段同名,那 么也可以采用以下函数中的简写形式
fn new_map(size: (usize, usize), pixels: Vec<u8>) -> GrayscaleMap {
assert_eq!(pixels.len(), size.0 * size.1);
GrayscaleMap { pixels, size }
}
Rust 中的其他构成项一样,结构体默认是私有的,其只在声明它 的模块中可见。要想让结构体对模块外部可见,需要在它的定义之前 加上 pub 关键字
如果命名字段后面跟着 .. EXPR,那么任何没有出现的字段都将从 EXPR 中取得自己的值
类元组结构体
struct Bounds(usize, usize);
// 或者建立一个公有的 pub struct Bounds(pub usize, pub usize);
let image_bounds = Bounds(1024, 768);
assert_eq!(image_bounds.0 * image_bounds.1, 786432);
类元组结构体很适合创建 (newtype),即只包含一个要经过 更严格类型检查的组件的结构体。比如,如果想只使用 ASCII 文本, 那么可以像这样定义一个新类型:
struct Ascii(Vec<u8>);
类基元结构体
struct Onesuch;
let o = Onesuch;
这种类型的值不占内存,非常像基元类型 ()。Rust 不会把类基元结 构体的值保存到内存里,也不会生成操作它们的代码,因为通过类型 就知道它的值了
很多类似 leetcode 的 rust 模板就是使用的这个
pub struct Solution;
impl Solution {
}
结构体内存布局
与 C 和 C++ 不同,Rust 不保证结构体的字段或元素在内存中会以某种顺序存储,上面的示意图只展示了一种可能的布局。不过,Rust 保 证把字段的值直接存储在结构体的内存块中
即Rust为了极致的优化,会将非Copy类型的元素存储在堆上,但是Copy类型会直接保存在栈上
impl 定义方法
impl 块只是 fn 定义的集合,这些函数都会成为块顶部提到名字的那 个结构体类型的方法;关联函数(associated funtion),因为它们是与特定类 型关联的。与关联函数相对的叫 (free function),即不 是作为 impl 块中的构成项定义的函数。
pub struct Queue<T> {
older: Vec<T>,
younger: Vec<T>
}
impl Queue {
pub fn is_empty(&self) -> bool {
self.older.is_empty() && self.younger.is_empty()
}
}
如果不将 self 作为参数的方法。这样的方法就成了与结 构体类型本身而非该类型的值关联的函数。遵循 C++ 和 Java 的传 统,Rust 称这些方法为静态方法
泛型结构体
impl<T> Queue<T> {
pub fn new() -> Queue<T> {
Queue { older: Vec::new(), younger: Vec::new() }
}
pub fn push(&mut self, t: T) {
self.younger.push(t);
}
pub fn is_empty(&self) -> bool {
self.older.is_empty() && self.younger.is_empty()
}
}
impl<T> Queue<T> 可以理解为:“对于任意类型 T,这 里给 Queue<T> 定义几个方法”。之后就可以在方法定义中使用类型 参数 T 作为一种类型了
Self 就表示 Queue<T>
携带生命参数的结构体
struct Extrema<'elt> {
greatest: &'elt i32,
least: &'elt i32
}
fn find_extrema<'s>(slice: &'s [i32]) -> Extrema<'s> {
let mut greatest = &slice[0];
let mut least = &slice[0];
for i in 1..slice.len() {
if slice[i] < *least { least = &slice[i]; }
if slice[i] > *greatest { greatest = &slice[i]; }
}
Extrema { greatest, least }
}
特型
Copy、Clone、Debug 和 PartialEq,它们被称为 (trait)
#[derive(Copy, Clone, Debug, PartialEq)]
struct Point {
x: f64,
y: f64
}
- 复习 Rust 结构体 (@2024-02-22 20:00)