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

news/2025/2/21 10:53:51/

数组

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

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

为数组声明类型,

let a: [u8; 5] = [1,2,3,4,5];

声明重复元素的数组,

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

Rust

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

由于基本类型在Rust中赋值是以Copy的形式,而复杂类型没有实现该方法,故报错。
改正,通过循环来声明实现Copy

let str_arr:[String;8] = std::array::from_fn(|_i| String::from("Good"));

结构体

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

C

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

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

#[derive(Debug)]
struct User {name: String,email: String,counts: i32,
} 

元组

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

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

元组常用于函数返回值,

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的语法,

enum PokerSuit {Clubs,Spades,Diamonds,Hearts,
}

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

enum PokerCard {Clubs(u8),Spades(u8),Diamonds(u8),Hearts(u8),
}fn main() {let c1 = PokerCard::Spades(5);let c2 = PokerCard::Diamonds(13);
}

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枚举变量来表达,

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);

http://www.ppmy.cn/news/1357031.html

相关文章

从0到1搭建SpringCloud项目教程

1、首先创建好一个springboot父工程&#xff0c;这里以springboot-aliyun-2.6.13举例 创建好工程后&#xff0c;将工程中的src目录删除掉&#xff0c;使之成为一个空着的父工程项目&#xff0c;这个项目将为我们管理当前父工程下所有微服务工程的pom依赖关系将父工程的pom文件…

多维时序 | Matlab实现BiLSTM-MATT双向长短期记忆神经网络融合多头注意力多变量时间序列预测模型

多维时序 | Matlab实现BiLSTM-MATT双向长短期记忆神经网络融合多头注意力多变量时间序列预测模型 目录 多维时序 | Matlab实现BiLSTM-MATT双向长短期记忆神经网络融合多头注意力多变量时间序列预测模型预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.多维时序 | Matlab…

Linux的expect工具完成命令行参数传递及可执行文件注入shell脚本

a.out每次只能得出一个结果&#xff0c;且需要根据提示&#xff0c;手动输入不同的参数。a.out的操作如下&#xff1a; $ ./a.out Input client IP address string: 1.1.1.105 Input server IP address string: 1.1.1.1 Input worker number: 4 worker id: 5因此想到使用shell…

【开源】SpringBoot框架开发高校宿舍调配管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统展示四、核心代码4.1 查询单条个人习惯4.2 查询我的室友4.3 查询宿舍4.4 查询指定性别全部宿舍4.5 初次分配宿舍 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的…

fastApi笔记01-路径参数

路径参数 使用与 Python 格式化字符串相同的语法来声明路径"参数"或"变量" from fastapi import FastAPIapp FastAPI()app.get("/items/{item_id}") def read_item(item_id):return {"item_id": item_id} http://127.0.0.1:8000/i…

Security6.2 中的SpEL 表达式应用(权限注解使用)

最近学习若依框架&#xff0c;里面的权限注解涉及到了SpEL表达式 PreAuthorize("ss.hasPermi(system:user:list)")&#xff0c;若依项目中用的是自己写的方法进行权限处理&#xff0c; 也可以只用security 来实现权限逻辑代码&#xff0c;下面写如何用security 实现。…

Transformer面试十问

1 Scaled Dot-Product Attention中为什么要除以 d k \sqrt{d_k} dk​ ​? 1. 从纯数学上考虑&#xff1a;对于输入均值为0,方差为1的分布&#xff0c;点乘后结果其方差为dk&#xff0c;所以需要缩放一下。下图为原论文注释。 2. 从神经网络上考虑&#xff1a;防止在计算点积…

基于python+django+vue.js开发的健身房管理系统

功能介绍 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 功能包括&#xff1a;教练管理、会员管理、场地管理、设备管理、用户管理、日志管理、系统信息模块。 源码地址 https://github.com/geeeeeeeek/python_…