【编程】Rust语言入门第5篇 复合类型——数组、结构体、元组、枚举

数组

Rust中有定长数组、变长数组,与两种字符串类似,前者在栈上,记为array,速度快,后者类型为Vector,在堆上,性能较低。

  • 声明
    Rust数组的声明比C形式较简,与Python形似。
rust 复制代码
let arr = [1,2,3,4,5];

为数组声明类型,

rust 复制代码
let a: [u8; 5] = [1,2,3,4,5];

声明重复元素的数组,

rust 复制代码
//重复5次的3
let a: [u8; 5] = [3; 5]
  • 遍历
    与Python相似,可用for <ele_var> in <arr>遍历数组,注意语法上的差异:
    Python
python 复制代码
a = [1,2,3,4,5]
for i in a:
    print(i)

Rust

rust 复制代码
let a = [1,2,3,4,5];
for i in a {
    println!("{}",i);
}
  • 索引
    注意避免越界,
rust 复制代码
fn main() {
    let a = [9, 8, 7, 6, 5];
    let first = a[0]; // 获取a数组第一个元素
    let second = a[1]; // 获取第二个元素
}
  • 数组元素是非基本类型
    如要,
rust 复制代码
let array = [String::from("rust is good!"); 8];
println!("{:#?}", array);

由于基本类型在Rust中赋值是以Copy的形式,而复杂类型没有实现该方法,故报错。

改正,通过循环来声明实现Copy

rust 复制代码
let str_arr:[String;8] = std::array::from_fn(|_i| String::from("Good"));

结构体

  • 定义
    Rust中结构体定义语法与C略有差异,
    Rust的语法
rust 复制代码
struct Person {
    name: String,
    id: String,
}

C

cpp 复制代码
struct Person{
    char name[30];
    char id[10];
};
  • 创建
    这与C&C++结构体初始化的语法很不同,
rust 复制代码
let auser = Person {
    name: String::from("Kirk"),
    id: String::from("001"),
};
  • 访问
    与C&C++相似。

利用#derive(Debug)打印结构体变量

rust 复制代码
#[derive(Debug)]
struct User {
    name: String,
    email: String,
    counts: i32,
} 

元组

C++、Python有相似的类型,

rust 复制代码
let at:(i32, f64, u8) = (300, 3.14, 0);
// 用`.`访问元组
let pi = at.1;

元组常用于函数返回值,

rust 复制代码
fn main() {
    let s1 = String::from("hello");
    let (s2, len) = calculate_length(s1);
    println!("The length of '{}' is {}.", s2, len);
}

fn calculate_length(s: String) -> (String, usize) {
    let length = s.len(); // len() 返回字符串的长度
    (s, length)
}

枚举

C++、Python有枚举类型

rust的语法,

rust 复制代码
enum PokerSuit {
  Clubs,
  Spades,
  Diamonds,
  Hearts,
}

与C++相似,枚举值也可以带有值,

rust 复制代码
enum PokerCard {
    Clubs(u8),
    Spades(u8),
    Diamonds(u8),
    Hearts(u8),
}

fn main() {
   let c1 = PokerCard::Spades(5);
   let c2 = PokerCard::Diamonds(13);
}

rust的枚举类型可以用任何类型做成员,太强大了。

rust 复制代码
enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

fn main() {
    let m1 = Message::Quit;
    let m2 = Message::Move{x:1,y:1};
    let m3 = Message::ChangeColor(255,255,0);
}

C语言中有null,指空值;而rust语言抛弃了null,改用Option枚举变量来表达,

rust 复制代码
fn plus_one(x: Option<i32>) -> Option<i32> {
    match x {
        None => None,
        Some(i) => Some(i + 1),
    }
}
let five = Some(5);
let six = plus_one(five);
let none = plus_one(None);
相关推荐
Rust研习社4 小时前
组合真的优于继承吗?为什么 Rust 和 Go 都拥抱组合舍弃继承?
后端·rust·编程语言
IT_陈寒5 小时前
JavaScript的闭包把我坑惨了,说好的内存会自动回收呢?
前端·人工智能·后端
CaffeinePro5 小时前
Pydantic深度使用:数据校验、枚举、ORM映射
后端·fastapi
Chenyiax6 小时前
从 Chat 到 Responses:OpenAI API 抽象为什么变了?
后端
MariaH6 小时前
Koa和Express的区别
后端
MariaH6 小时前
Koa框架的使用
后端
luckdewei7 小时前
那个用 passlib 做认证的新同事,上线第一天就把用户密码写进了日志
后端
ping某8 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
JustHappy9 小时前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
uhakadotcom9 小时前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github