复合 类型

字符串和切片

切片

切片的作用是允许你引用集合中部分连续的元素序列,而不是引用整个集合。

例如:

let s = String::from("hello world");let hello = &s[0..5];  // 切片 [0,5)  等效于&s[..5]
let world = &s[6..11];  // 切片 [6,11) 等效于&s[6..]
// 完整的s,&s[..]

注意,方括号中的数字是字节,如果字符是多字节的(如汉字),这时如果切片没有落在两个字符之间,程序就会崩溃(汉字是三个字节,切片0-2就会崩溃)

字符串的切片类型是 &str,i32数组的切片类型是 &[i32]

这样一段代码:let s = "Hello world!";, s 是个切片类型,实际上代码为:let s: &str = "Hello world!"

字符串

Rust中字符是 Unicode 类型。内存占用 从1 - 4 个字节空间。

Rust中常用的字符串类型有 str / String,str硬编码不可变,String可变。

// &str --> String
String::from("Hello world");
"hello world".to_string();// String --> &str
&s;

操作字符串

let mut s = String::from("Hello ");
// 追加字符串
s.push_str("rust");
// 追加字符
s.push('!');
// 插入字符
s.insert(5, ',');
// 插入字符串
s.insert_str(6, " I like");// 替换
// replace 适用于 String 和 &str,替换所有,返回一个新字符串,而不是操作原来的字符串
let new_string_replace = string_replace.replace("rust", "RUST");
// replacen 适用于 String 和 &str, 替换指定个数,返回一个新字符串,而不是操作原来的字符串
let new_string_replacen = string_replace.replacen("rust", "RUST", 1);
// replace_range 适用于 String,替换指定范围字符串,操作原来的字符串
string_replace_range.replace_range(7..8, "R");// 删除
// 均是操作原来的字符串
// pop 删除并返回最后一个字符
let p1 = string_pop.pop();
// remove 删除并返回指定位置字符
string_remove.remove(0);
// truncate 删除指定位置到结尾
string_truncate.truncate(3);
// clear 清空字符串
string_clear.clear();// 连接
// + += ,右面必须是字符串的切片引用类型,相当于调用std::string add(),返回一个新字符串
let result = string_append + &string_rust;
// format! 
let s = format!("{} {}!", s1, s2);

遍历字符串

// 以 unicode 字符方式遍历字符串
for c in "中国人".chars() {println!("{}", c);
}

元组

元组是由多种类型组合到一起形成的,因此它是复合类型,元组的长度是固定的,元组中元素的顺序也是固定的。

fn main() {let tup: (i32, f64, u8) = (500, 6.4, 1);
}

使用元组:

fn main() {let tup = (500, 6.4, 1);// 模式匹配let (x, y, z) = tup;println!("The value of y is: {}", y);// .let five_hundred = x.0;let six_point_four = x.1;// 函数let s1 = String::from("hello");let (s2, len) = calculate_length(s1);
}fn calculate_length(s: String) -> (String, usize) {let length = s.len(); // len() 返回字符串的长度(s, length)
}

结构体

使用

结构体的定义:

struct User {active: bool,username: String,email: String,sign_in_count: u64,
}

结构体的创建和使用:

// 每个都需要初始化,顺序可以打乱
let mut user1 = User {email: String::from("someone@example.com"),username: String::from("someusername123"),active: true,sign_in_count: 1,
};// 访问字段,
// **必须要将结构体实例声明为可变的,才能修改其中的字段,Rust 不支持将某个结构体某个字段标记为可变。**
user1.email = String::from("anotheremail@example.com");// 简化创建
fn build_user(email: String, username: String) -> User {User {email,username,active: true,sign_in_count: 1,}
}// 更新
let user2 = User {email: String::from("another@example.com"),..user1  // 注意 username 发生了所有权转移,不能再被user1使用
};

内存排列

struct File {name: String,data: Vec<u8>,
}

内存结构:

元组结构体

元组结构体的字段没有名称:

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);

使用的使用可以直接用 x,y,z / r,g,b

单元结构体

单元结构体没有任何字段和属性

struct AlwaysEqual;let subject = AlwaysEqual;// 我们不关心 AlwaysEqual 的字段数据,只关心它的行为,因此将它声明为单元结构体,然后再为它实现某个特征
impl SomeTrait for AlwaysEqual {}

结构体的所有权

如果你想在结构体中使用一个引用,就必须加上生命周期,否则就会报错!

生命周期篇再写。

打印

  • 使用 #[derive(Debug)] 来打印结构体信息。

    println!("{:?}",struct);

    dbg!(&struct);

  • 也可以实现 Display 特征打印信息(类似 toString() 方法)

    println!("{}",struct);

枚举

使用:

可以向其他语言一样直接使用,也可以为其关联数据信息

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

更为复杂的:

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

使用Option枚举处理空值

在rust中使用Option枚举来处理对象为空的情况(null):

enum Option<T> {Some(T),None,
}

使用的使用将值存入 Some<T> 中,这样在使用变量的时候因为不能直接使用 Option,所以需要将值取出来再用。而取出来的时候需要判断值不是Option::None才能用,相当于变相强制进行了判空操作,放置了空指针异常。

数组

在Rust中有两种数组,一种是长度固定吗,速度快的 array,一种是长度动态,性能较低的 vector。

array存储在栈上,vector存储在堆上。

array

使用:

fn main() {// 1.定义// let a: [i32; 5] = [1, 2, 3, 4, 5];  声明类型let a = [1, 2, 3, 4, 5];// 重复:5个3let a = [3; 5]; // 非基础元素// let array = [String::from("rust is good!"); 8];  ×  不能深拷贝let array: [String; 8] = std::array::from_fn(|i| String::from("rust is good!"));// 2.访问let first = a[0]; // 获取a数组第一个元素
}

数组切片

  • 创建切片的代价非常小,因为切片只是针对底层数组的一个引用
  • 切片类型[T]拥有不固定的大小,而切片引用类型&[T]则具有固定的大小,因为 Rust 很多时候都需要固定大小数据类型,因此&[T]更有用,&str字符串切片也同理
let a: [i32; 5] = [1, 2, 3, 4, 5];let slice: &[i32] = &a[1..3];  // 引用assert_eq!(slice, &[2, 3]);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/92779.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑缺失msvcp140.dll怎么办?解决msvcp140.dll缺失问题

msvcp140.dll是Microsoft Visual C Redistributable中的一个动态链接库文件&#xff0c;用于提供运行时支持。它的主要作用是为应用程序提供必要的函数和组件&#xff0c;以便在运行时执行特定的任务。当系统中缺少msvcp140.dll文件时&#xff0c;我们打开游戏或许软件时候就会…

Wordcloud | 风中有朵雨做的‘词云‘哦!~

1写在前面 今天可算把key搞好了&#xff0c;不得不说&#x1f3e5;里手握生杀大权的人&#xff0c;都在自己的能力范围内尽可能的难为你。&#x1f602; 我等小大夫也是很无奈&#xff0c;毕竟奔波霸、霸波奔是要去抓唐僧的。 &#x1f910; 好吧&#xff0c;今天是词云&#x…

使用selenium如何实现自动登录

回顾使用requests如何实现自动登录一文中&#xff0c;提到好多网站在我们登录过后&#xff0c;在之后的某段时间内访问该网页时&#xff0c;不会给出请登录的提示&#xff0c;时间到期后就会提示请登录&#xff01;这样在使用爬虫访问网页时还要登录&#xff0c;打乱我们的节奏…

【BASH】回顾与知识点梳理(二十七)

【BASH】回顾与知识点梳理 二十七 二十七. 磁盘配额(Quota)27.1 磁盘配额 (Quota) 的应用与实作什么是 QuotaQuota 的一般用途Quota 的使用限制Quota 的规范设定项目 27.2 一个 XFS 文件系统的 Quota 实作范例实作 Quota 流程&#xff1a;设定账号实作 Quota 流程-1&#xff1a…

Python random模块用法整理

随机数在计算机科学领域扮演着重要的角色&#xff0c;用于模拟真实世界的随机性、数据生成、密码学等多个领域。Python 中的 random 模块提供了丰富的随机数生成功能&#xff0c;本文整理了 random 模块的使用。 文章目录 Python random 模块注意事项Python random 模块的内置…

用AI攻克“智能文字识别创新赛题”,这场大学生竞赛掀起了什么风潮?

文章目录 一、前言1.1 大赛介绍1.2 项目背景 二、基于智能文字场景个人财务管理创新应用2.1 作品方向2.2 票据识别模型2.2.1 文本卷积神经网络TextCNN2.2.2 Bert 预训练微调2.2.3 模型对比2.2.4 效果展示 2.3 票据文字识别接口 三、未来展望 一、前言 1.1 大赛介绍 中国大学生…

时序预测-Informer简介

文章目录 Informer介绍1. Transformer存在的问题2. Informer研究背景3. Informer 整体架构3.1 ProbSparse Self-attention3.2 Self-attention Distilling3.3 Generative Style Decoder 4. Informer的实验性能5. 相关资料 Informer介绍 1. Transformer存在的问题 Informer实质…

网络套接字

网络套接字 文章目录 网络套接字认识端口号初识TCP协议初识UDP协议网络字节序 socket编程接口socket创建socket文件描述符bind绑定端口号sockaddr结构体netstat -nuap&#xff1a;查看服务器网络信息 代码编译运行展示 实现简单UDP服务器开发 认识端口号 端口号(port)是传输层协…

【Linux】ICMP协议——网络层

ICMP协议 ICMP&#xff08;Internet Control Message Protoco&#xff09;Internet控制报文协议&#xff0c;用于在IP主机、路由器之间传递控制信息&#xff0c;是一个TCP/IP协议。该协议是用来检测网络传输的问题&#xff0c;相当于维修人员的工具。 ICMP协议的定位 在TCP/IP…

Aspera替代方案:探索这些安全且可靠的文件传输工具

科技的发展日新月异&#xff0c;文件的传输方式也在不断地更新换代。传统的邮件附件、FTP等方式已经难以满足人们对于传输速度和安全性的需求了。近年来&#xff0c;一些新兴的文件传输工具受到了人们的关注&#xff0c;其中除了知名的Aspera之外&#xff0c;还有许多可靠安全的…

简绘ChatGPT支持Midjourney绘图 支持stable diffusion绘图

简绘支持Midjourney绘图和stable diffusion绘图。 这意味着简绘具备Midjourney绘图和stable diffusion绘图功能的支持。

CSS自学框架之表单

首先我们看一下表单样式&#xff0c;下面共有5张截图 一、CSS代码 /*表单*/fieldset{border: none;margin-bottom: 2em;}fieldset > *{ margin-bottom: 1em }fieldset:last-child{ margin-bottom: 0 }fieldset legend{ margin: 0 0 1em }/* legend标签是CSS中用于定义…

《qt quick核心编程》笔记四

11 Model/View Delegate实际上可以看成是Item的一个模板 11.1 ListView ListView用于显示一个条目列表&#xff0c;数据来自于Model&#xff0c;每个条目的外观来自于Delegate 要使用ListView必须指定一个Model、一个Delegate Model可以是QML内建类型&#xff0c;如ListModel…

QGraphicsView实现简易地图6『异步加载-无底图』

前文链接&#xff1a;QGraphicsView实现简易地图5『经纬网格』 同步加载&#xff0c;虽然程序已做到最少瓦片加载&#xff0c;但或多或少都存在一定程度上的卡顿现象&#xff0c;或者说是不够流畅吧。因此尝试采用异步加载&#xff0c;大致思路是每次缩放或漫游时计算所需重新加…

服务器如何防止cc攻击

对于搭载网站运行的服务器来说&#xff0c;cc攻击应该并不陌生&#xff0c;特别是cc攻击的攻击门槛非常低&#xff0c;有个代理IP工具&#xff0c;有个cc攻击软件就可以轻易对任何网站发起攻击&#xff0c;那么服务器如何防止cc攻击?请看下面的介绍。 服务器如何防止cc攻击&a…

K8S系列文章之 Docker安装使用Kafka

通过Docker拉取镜像的方式进行安装 照例先去DockerHub找一下镜像源&#xff0c;看下官方提供的基本操作&#xff08;大部分时候官方教程比网上的要清晰一些&#xff0c;并且大部分教程可能也是翻译的官方的操作步骤&#xff0c;所以直接看官方的就行&#xff09; 老实说Kafka…

LangChain入门:构建LLM驱动的应用程序的初学者指南

LangChain & DemoGPT 一、介绍 你有没有想过如何使用大型语言模型&#xff08;LLM&#xff09;构建强大的应用程序&#xff1f;或者&#xff0c;也许您正在寻找一种简化的方式来开发这些应用程序&#xff1f;那么你来对地方了&#xff01;本指南将向您介绍LangChain&#x…

Kubernetes入门 五、深入Pod:探针和生命周期

目录 探针探针类型LivenessProbeReadinessProbeStartupProbe&#xff1a; 探测方式ExecActionTCPSocketActionHTTPGetAction 参数配置操作示例 生命周期钩子函数生命周期 探针 所谓的探针就是容器内应用的监测机制&#xff0c;为了确保容器在部署后确实处在正常运行状态。 比…

PyTorch翻译官网教程-NLP FROM SCRATCH: CLASSIFYING NAMES WITH A CHARACTER-LEVEL RNN

官网链接 NLP From Scratch: Classifying Names with a Character-Level RNN — PyTorch Tutorials 2.0.1cu117 documentation 使用CHARACTER-LEVEL RNN 对名字分类 我们将建立和训练一个基本的字符级递归神经网络(RNN)来分类单词。本教程以及另外两个“from scratch”的自然…

学习笔记整理-DOM-01-基础知识

一、DOM基本概念 1. DOM基本概念 DOM是JS操控HTML和CSS的桥梁。DOM是JS操作HTML变得优雅。 DOM(Document Object Model&#xff0c;文档对象模型)是JavaScript操作HTML文档的接口&#xff0c;使文档操作变得非常优雅、简便。DOM最大的特点就是将文档表示为节点树。 节点的node…