rust数据类型

目录

一,基本类型

1,基本类型

(1)整数类型

(2)浮点数

(3)bool类型

(4)char类型

2,基本类型的代数结构

二,复合类型

1,序列、单元序列、切片

2,元组、单元元组

3,结构体、空结构体、单元结构体

4,元组结构体、单元元组结构体

5,枚举

(1)枚举的成员

(2)整型值的显式声明

(3)整型值的隐式推导

(4)直接使用枚举值

(5)把枚举值转换成整数

6,数据大小

(1)基本类型

(2)序列、单元序列、切片、空切片、元组、单元元组、枚举

(3)结构体、空结构体、单元结构体、元组结构体、单元元组结构体

(4)指针、字符串


一,基本类型

1,基本类型

(1)整数类型

	let x=111_222_3334;let y:u16=1123;

整数默认是i32类型,整数中间的下划线可以忽略。

(2)浮点数

在 Rust 中浮点类型数字也有两种基本类型: f32 和 f64

	let x=2.5;let y:f32=1.23;

浮点数默认是f64类型。

浮点数都有唯一的非自反元素NAN,所以std里面判断一个数是不是NAN的源码是这么写的:

    pub const fn is_nan(self) -> bool {self != self}

(3)bool类型

取值:false true

(4)char类型

    let heart_eyed_cat:char = '😻';println!("{}",heart_eyed_cat);let z:char = '我';println!("{}",z);

rust的char类型范围比较大,中文甚至emoji都算,char类型大小为4个字节。

char类型大小为什么是为4个字节?

因为rust字符串采用utf-8编码,而utf-8一个字符最多占4个字节。

char和整数互转规则:

u8可以用as转为char,u16和u32都不行,而char可以用as转为u8和u16和u32

    let x:u8=100;let c=char::from(x);let x:u32=100;let c2=char::from_u32(x);assert_eq!(c2,Some(c));let c3=char::try_from(x);assert_eq!(c3,Ok(c));

2,基本类型的代数结构

在c++中,基本类型都是有等价关系的。

然而在rust中,浮点数只有部分等价关系,没有等价关系,Rust 的整数类型、字符串类型、布尔类型都有等价关系。

所以,哈希表的key类型可以是整数类型、字符串类型、布尔类型,不能是浮点数类型。

二,复合类型

1,序列、单元序列、切片

序列,也称为数组

(1)自动生成序列:

序列相当于是整数的复合类型。

	for i in 1..=5{	println!("{}",i);}

带了等号,所以序列是1,2,3,4,5

去掉等号,序列就是1,2,3,4

(2)普通序列、切片

fn main() {let mut c = [1,2,3,4,8,6];let slice = &mut c[1..3];slice[0]=9;assert_eq!(c,[1,9,3,4,8,6]);
}

c就是普通序列(数组),slice就是切片

(3)单元序列

单元序列就是空序列:

    let mut x =Vec::from([]);x.push(5);

2,元组、单元元组

(1)元组

    let t = (1,1.5,"what");assert_eq!(t.0, 1);assert_eq!(t.1, 1.5);assert_eq!(t.2, "what");

(2)单元元组

单元元组就是空元组,有2种用法,一是用于没有返回值的函数:

fn f() {print!("{}",123);
}
fn f2()->() {print!("{}",123);
}
fn f3()->(){print!("{}",123);return ();
}

 二是用作map的值,表示不关心值,只关心key。

fn main() {let mut map = HashMap::new();assert_eq!(map.insert(3, ()), None);assert_eq!(map.insert(5, ()), None);
}

3,结构体、空结构体、单元结构体

(1)结构体

#[derive(PartialEq, Eq, Clone, Debug)]
struct S{x:i32,y:i32
}
fn main() {let s1=S{y:1, x:2};let s2=S{x:3,..s1};assert_eq!(s2,S{x:3,y:1});println!("end");
}

创建结构体实例时,必须写明成员名:成员值,所以顺序也叫无所谓了。

(2)2种省略写法

省略写法一:可以根据一个结构体实例创建另一个结构体实例,除了写明的成员,其他成员用相同值进行初始化。

struct Pointer{x:i32,y:i32
}
fn main() {let a=Pointer{x:3,y:4};let p=Pointer{x:5,..a};assert_eq!(5,p.x);assert_eq!(4,p.y);
}

其中..a表示从a抄录部分成员值,..a必须写在最后面

省略写法二:可以把形如x:x简写成x,必须完全同名时才可以简写。

struct Pointer{x:i32,y:i32
}
fn main() {let x=5;let a=Pointer{x:x,y:4};let p=Pointer{x,y:4};assert_eq!(5,p.x);assert_eq!(4,p.y);let p=Pointer{y:4,x};assert_eq!(5,p.x);assert_eq!(4,p.y);
}

小结:

..a必须写在最后面,其他的成员赋值无论先后,每一个都可以按照名字严格对应。

(3)空结构体

struct S{}fn main(){let a=S{};//let b=S; //error
}

(4)单元结构体

单元结构体的定义最简洁,只有一个名字:

struct S2;fn main(){let c=S2{};let d=S2;
}

4,元组结构体、单元元组结构体

(1)元组结构体

元组结构体就是又像元组又像结构体的一种数据结构,语法和元组和结构体都不一样。

struct Point(i32, i32, i32);fn main() {let x = Point(3,0,0);assert_eq!(x.0, 3);
}

PS:结构体成员是必须按照名字对应,顺序无所谓,元组结构体是必须按照顺序对应,没有名字。

(2)单元元组结构体

struct S();fn main() {let x=S();print!("end");
}

5,枚举

枚举的BNF:

Enumeration :
   enum IDENTIFIER  GenericParams? WhereClause? { EnumItems}

EnumItems :
   EnumItem ( , EnumItem )* ,?

EnumItem :
   OuterAttribute* Visibility?
   IDENTIFIER ( EnumItemTuple | EnumItemStruct )? EnumItemDiscriminant?

EnumItemTuple :
   ( TupleFields? )

EnumItemStruct :
   { StructFields? }

EnumItemDiscriminant :
   = Expression

也就是说,枚举的成员可以有3种类型随意组合,分别是元组tuple,结构体,还有表达式

虽然说单个整型变量也是表达式,但是枚举里面的表达式好像只能是整型变量。

(1)枚举的成员

细分下来一共是五种:

enum Enum0 {Tuple1(),Tuple2(i32,f32),Struct1{},Struct2{x:i32,y:f64},X,
}

五个成员分别是单元元组,元组结构体,单元结构体,结构体,整型变量。

所有的枚举成员,都对应一个整型值,默认是isize类型,允许编译器采用更小的整数类型。

(2)整型值的显式声明

前提条件:要么只有整型变量,要么用repr显式声明了枚举整数类型

enum Enum1 {X=7,Y,Z=-100
}#[repr(u8)]
enum Enum2 {Tuple1(),Tuple2(i32,f32),Struct1{},Struct2{x:i32,y:f64},X=200,
}

(3)整型值的隐式推导

推导规则:从有显式声明的,往下依次加一,如果第一个成员没有声明,那就是0

推导失败就编译失败:按照推导规则发现有重复值的(包括显式声明重复值的),或者推导值超出了整数范围的,就编译失败

(4)直接使用枚举值

最简单的例子:

#[derive(Debug,PartialEq)]
enum Enum {X=200,
}fn main() {let x=Enum::X;assert_eq!(Enum::X, x);
}

Debug和PartialEq都是必须声明的。

复杂一点的例子:

#[repr(u8)]
#[derive(Debug,PartialEq)]
enum Enum {Tuple1()=3,Tuple2(i32,i64),Struct0{},Struct1{},Struct2{x:i32,y:i64}=100,    X=200,
}fn main() {let x1 = Enum::Tuple1();let x2 = Enum::Tuple2(5,6);let x3=Enum::Struct0{};let x4=Enum::Struct1{};let x5=Enum::Struct2{x:7,y:8};let x6=Enum::X;assert_eq!(Enum::Tuple1(), x1);assert_eq!(Enum::Tuple2(5,6), x2);assert_ne!(x1,x2);assert_eq!(Enum::Struct0{}, x3);assert_ne!(x3,x4);assert_eq!(Enum::Struct2{x:7,y:8}, x5);assert_ne!(Enum::Struct2{x:9,y:9}, x5);assert_eq!(Enum::X, x6);
}

Enum里面2个单元结构体是不相等的。

对于2个枚举变量对应的是Enum里面同一个枚举值的,比如都是Struct2,还需要里面的成员相等,2个枚举变量才完全相等。

(5)把枚举值转换成整数

前提条件:只由单元元组、单元结构体、整型变量构成,且只有整型变量有显示声明整型值

#[repr(u8)]
enum Enum {Tuple1(),X=100,Tuple2(),Struct0{},Y=200,Struct1{},    
}fn main() {assert_eq!(Enum::Tuple1() as u8, 0);assert_eq!(Enum::X as u8, 100);assert_eq!(Enum::Tuple2() as u8, 101);assert_eq!(Enum::Struct0{} as u8, 102);assert_eq!(Enum::Y as u8, 200);assert_eq!(Enum::Struct1{} as u8, 201);
}

6,数据大小

use std::mem::size_of;

use std::mem::size_of_val;

(1)基本类型

fn main() {assert_eq!(size_of::<i8>(),1);assert_eq!(size_of::<u8>(),1);assert_eq!(size_of::<i16>(),2);assert_eq!(size_of::<u16>(),2);assert_eq!(size_of::<i32>(),4);assert_eq!(size_of::<u32>(),4);assert_eq!(size_of::<i64>(),8);assert_eq!(size_of::<u64>(),8);assert_eq!(size_of::<i128>(),16);assert_eq!(size_of::<u128>(),16);assert_eq!(size_of::<f32>(),4);assert_eq!(size_of::<f64>(),8);assert_eq!(size_of::<bool>(),1);assert_eq!(size_of::<char>(),4);println!("end");
}

(2)序列、单元序列、切片、空切片、元组、单元元组、枚举

enum Enum {X=253,Y,Z
}
enum Enum2 {X=254,Y,Z
}fn main() {let x=[false,true];//序列=单个尺寸*个数assert_eq!(size_of_val(&x),2);let x:[bool;0]=[];assert_eq!(size_of_val(&x),0);//单元序列=固定0let y=&x[..];assert_eq!(size_of_val(&y),16);//切片=固定16let y=&x[0..0];assert_eq!(size_of_val(&y),16);//空切片也是16let z=(false,1);assert_eq!(size_of_val(&z),8);//元组 4+4let z=(1,false,y);assert_eq!(size_of_val(&z),24);//元组 4+4+16let z=();assert_eq!(size_of_val(&z),0);//单元元组=固定0assert_eq!(size_of::<Enum>(),1);//枚举的大小等于最大枚举值的大小assert_eq!(size_of::<Enum2>(),2);println!("end");
}

其中,元组的规则应该是等同于普通结构体。

(3)结构体、空结构体、单元结构体、元组结构体、单元元组结构体

结构体的大小计算涉及到对齐值的概念,这一部分和C相同,具体细节参考结构体大小和对齐值。

不同的是,rust中的结构体默认会自动重排,如果加了#[repr(C)]属性宏则不会重排


struct S1{a:u32,b:u16,c:u8,
}
struct S2{b:u16,a:u32,c:u8,
}
#[repr(C)]
struct S3{b:u16,a:u32,c:u8,
}struct S4{}
struct S5;
struct S6(i32,bool);
struct S7();fn main() {assert_eq!(size_of::<S1>(),8);//普通结构体assert_eq!(size_of::<S2>(),8);//重排结构体assert_eq!(size_of::<S3>(),12);//禁止重排的普通结构体assert_eq!(size_of::<S4>(),0);//空结构体=固定0assert_eq!(size_of::<S5>(),0);//单元结构体=固定0assert_eq!(size_of::<S6>(),8);//元组结构体 4+4assert_eq!(size_of::<S7>(),0);//单元元组结构体=固定0println!("end");
}

(4)指针、字符串

​
fn main() {let p=&1 as *const i32;let psize = size_of_val(&p);// psize=4或者8,看机器let a=&1;assert_eq!(size_of_val(&a),psize);//普通引用等同于指针let b=&[1,2];assert_eq!(size_of_val(&b),psize);//引用数组是普通引用,所以等同于指针let c=&b[..];assert_eq!(size_of_val(&c),psize*2);//引用切片是胖指针,等同于2个指针let s:&str="123";assert_eq!(size_of_val(&c),psize*2);//&str是引用切片,所以是胖指针let s=String::from("12345678");assert_eq!(size_of_val(&s),size_of::<Vec<u8>>());//String对象的大小是固定的,和内部数据长度无关println!("end");
}​

在64位机器上,String是24个字节。

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

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

相关文章

【信息学奥赛】CSP-J/S初赛04 进制转换相关问题(二、八、十六进制与十进制互相转换)

​ 大家好&#xff0c;我是bigbigli&#xff0c;今天我们学习初赛中常考的一个数学内容——进制转换 进制转换 常用的数制 权&#xff1a;数制中某一位上的1所表示的数值的大小&#xff0c;比如十进制中的123&#xff0c;1的位权是100,2的位权是10,3的位权是1。 进制基数基数…

这些帮助你成长的IOS应用,建议收藏

TrackIt TrackIt是一款功能丰富的任务清单、日程管理和习惯打卡应用&#xff0c;旨在帮助用户提高效率和专注力。通过这些功能&#xff0c;用户可以更好地规划时间和任务&#xff0c;从而实现个人目标和养成良好习惯。 在目标设定方面&#xff0c;SMART原则是一个常用的方法&a…

【决战欧洲之巅】丹麦 vs 英格兰战术分析和球员状态以及走地数据分析

丹麦 vs 英格兰战术分析和球员状态 阵型与战术 丹麦: 阵型:丹麦通常采用4-3-3阵型&#xff0c;以因防守为基础&#xff0c;同时通过快速反击等找机会。 ”战术: 防守:丹麦在防守时以紧密的四后卫体彩为核心&#xff0c;辅以中场球员的积极回防&#xff0c;形成稳因的防 线。…

解决HassOS无法获取ip地址问题

目录 问题描述解法 问题描述 在ESXi中安装完HassOS后&#xff0c;开机遇到一个无法获取ip地址的问题&#xff0c;如下图所示&#xff1a; 输入network info命令&#xff0c;显示ipv4已被禁用&#xff0c;如下图所示&#xff1a; 解法 在控制台ha >后输入下面命令 netw…

基于Java技术“漫画之家”系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术&#xff0c;B/S结构&#xff0c;SpringBoot框架 工具&#xff1a;MyEc…

使用Python写入Excel文件,设置列宽和行高

哈喽,大家好,我是木头左! Python与Excel的完美结合 在当今这个数据爆炸的时代,处理大量数据已经成为了日常工作的一部分。而Python作为一种功能强大、易于学习的编程语言,已经成为了数据处理的首选工具。那么,如何将Python与Excel结合起来,实现数据的高效处理呢?本文将…

DBdoctor v3.2.1 版本发布,支持对瀚高、人大金仓的纳管!

DBdoctor v3.2.1版本发布&#xff0c;更新内容如下&#xff1a; 功能优化 SQL审核&#xff1a;新增批量SQL审核功能&#xff0c;支持通过文件上传或者输入窗口批量提交的方式进行SQL审核。 新增数据库引擎 新增对瀚高、人大金仓数据库引擎的纳管支持。 瀚高&#xff08;highg…

板凳--------第60章 SOCKET:服务器设计

60.1 迭代型和并发型服务器 1016 1.迭代型&#xff1a; 服务器每次只处理一个客户端&#xff0c;只有当完全处理完一个客户端的请求后才会去处理下一个客户端。只适用于快速处理客户端请求的场景&#xff0c;因为每个客户端都必须等待&#xff0c;直到前面所有的客户端都处理完…

一键批量复制至指定文件夹,轻松实现同名文件覆盖,数据管理更高效!

在数字化时代&#xff0c;文件的管理与复制是每位电脑用户都不可避免的日常工作。你是否曾因为大量文件的复制与更新而焦头烂额&#xff1f;是否曾因为同名文件的冲突而不知所措&#xff1f;别担心&#xff0c;现在&#xff0c;我们为您带来高效文件复制管理的秘诀&#xff0c;…

【管理咨询宝藏132】国际顶级咨询公司战略组织运营报告套装

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏132】国际顶级咨询公司战略&组织&运营报告套装 【格式】PDF版本 【关键词】德勤、罗兰贝格、外资咨询、战略规划、组织管控、运营提升、…

HNU操作系统2022期中考试试卷及参考答案

一、&#xff08;20分&#xff0c;每小题5分&#xff09;简答题 &#xff08;1&#xff09;通过多任务共享实现的虚拟化CPU与通常虚拟机&#xff08;VMware等&#xff09;里所使用的虚拟化技术有什么不一样&#xff1f; 多任务共享实现的虚拟化CPU通常指的是在操作系统层面&am…

证书速览|CCSK云计算安全知识认证

随着云计算技术的发展&#xff0c;现在越来越多的企业感受到云的好处&#xff0c;把业务逐渐转移到云上。上云是大势所趋&#xff0c;也是现今企业发展的实际需要。 这就意味着企业会更青睐于具备云安全专业知识、技能与经验的人员。 CCSK 云计算安全知识认证&#xff0c;是由…

065、Python 关于一等函数的理解

在Python编程语言中&#xff0c;函数是作为一等对象&#xff08;first-class objects&#xff09;的存在。这意味着函数在编程中享有与其他数据类型相同的地位&#xff08;即可以像其他对象一样被操作&#xff09;。例如可以赋值给变量、作为参数传递给函数、作为函数的返回值等…

【学习笔记】Maven高级01:POM深入了解

文章目录 一、POM的四个层次超级POM父POM当前POM有效POM(effective pom) 二、属性的声明和引用使用 mvn help:evaluate查看属性通过Maven访问系统属性1、访问Java系统属性2、访问系统属性4、访问系统环境变量5、访问project属性访问一级标签访问子标签访问标签列表 6、访问全局…

欢迎加入大雨的 Java 开发交流群

最近建了一个 Java开发交流群&#xff0c;欢迎苏州、上海朋友加入&#xff0c;后期会举办线下交流活动。 本群的宗旨&#xff1a;让所有学习的群友都有进步的机会。 1. 经验交流 在我们学习时遇到困境&#xff0c;或者开发过程中遇到难题&#xff0c;都可以将你的问题抛出来&…

c++里 父类私有的虚函数,也是可以被子类重写和继承的。但父类私有的普通函数,子类无法直接使用

谢谢 。今天看课本上有这么个用法&#xff0c;特测试一下。这样就也可以放心的把父类的私有函数列为虚函数了&#xff0c;或者说把父类的虚函数作为私有函数了。 再补充一例&#xff1a;

2024-06月 | 维信金科 | 风控数据岗位推荐,高收入岗位来袭!

今日推荐岗位&#xff1a;策略分析经理/分析专家、贷前、中策略分析、风控模型分析。 风控部门是金融业务的核心部门&#xff0c;而从事风控行业的人即称之为风险管理者。是大脑&#xff0c;是最最最重要的部门之一。今日推荐岗位的核心技能分布如下&#xff1a; 简历发送方式…

如何使用ChatGPT辅助设计工作

文章目录 设计师如何使用ChatGPT提升工作效率&#xff1f;25个案例告诉你&#xff01;什么是 prompt&#xff1f;咨询信息型 prompt vs 执行任务 prompt编写出色 prompt 的基本思路撰写 prompt 的案例和技巧1、将 ChatGPT 视作专业人士2、使用 ChatGPT 创建表单3、使用 ChatGPT…

全国城市划分JSON数据 + 城市拼音首字母

前言 客户端开发&#xff0c;选择地址的功能很常见&#xff0c;全国城市数据网上有很多&#xff0c;但有城市拼音首字母的很少&#xff1b; 需求一&#xff1a;选择地址目录边缘有一竖排&#xff0c;A到Z的大写字母&#xff0c;这个首字母&#xff0c;就是城市拼音首字母&am…

《昇思25天学习打卡营第2天 | 快速入门》

《昇思25天学习打卡营第2天 | 快速入门》 活动地址&#xff1a;https://xihe.mindspore.cn/events/mindspore-training-camp 签名&#xff1a;Sam9029 快速实现一个简单的深度学习模型 今天学习使用 MindSpore的API来快速实现一个简单的深度学习模型 感觉今天的 课程章节目的…