当前位置:网站首页>【一起学Rust 基础篇】Rust基础——变量和数据类型
【一起学Rust 基础篇】Rust基础——变量和数据类型
2022-08-03 11:06:00 【m0_67391521】
目录
前言
经过前面几期的学习,大家应该对Rust已经有了个初步的了解。现在我们将从Rust的基础开始学习。
变量是一个编程语言必要的内容,学习任何一门编程语言都离不开变量,而是基础中的基础,学习Rust也是这样的。本期我们将从Rust变量的概念开始讲起,同时搭配编程案例,辅以作业,帮助大家学习和理解Rust的变量基础概念。
一、定义变量
Rust定义变量需要使用关键词let,这点和Javascript是一致的,如果你有JS开发的经验,那你应该很熟悉。现在我们定义几个变量
let x = 5;
let y = 5.0;
let str = String::from("Hello");
以上的几个变量都是没有问题的,定义了三个变量,x是整数型的,y是浮点型的,z是字符串型的。除此以外,Rust还支持指定变量类型来定义变量
let x: i32 = 5;
let y: f64 = 5.0;
let str: String = String::from("Hello");
其实我们并不是一定得指定类型,因为Rust可以自动推断你使用的是哪种类型。
二、Rust变量的可变性
在Rust中,变量默认是不可变的。如果你写了如下代码,就会报错
fn main() {
let x = 5;
println!("The value of x is: {x}");
x = 6;
println!("The value of x is: {x}");
}
报错如下
现在我们分析一下这个报错,首先看红色的报错,翻译过来的意思是,不可变的变量不可以赋值两次。意思就是不可变的变量不能再次赋值。
然后我们看蓝色的部分,第一次给x分配值,帮助:考虑使x变得可变,`mut x`。可以看出,蓝色的部分是帮助我们修改这个错误的,这也是Rust比较强大的地方之一。按照这个提示,我们应该这么改,
let mut x: i32 = 5;
print!("The value of x is: {}", x);
x = 6;
print!("The value of x is: {}", x);
此时我们继续运行看看,
因此我们得出结论,Rust的变量默认是不可变的,只有添加mut关键字以后才会变得可变。
三、Rust基本数据类型
1.数值类型
数值类型又分为整数型、浮点数、序列类型。
整型
长度
有符号
无符号
8-bit
i8
u8
16-bit
i16
u16
32-bit
i32
u32
64-bit
i64
u64
128-bit
i128
u128
arch
isize
usize
其中,每个长度都有有符号和无符号两种,有符号表示这个数分正数和负数,无符号则表示这个数据类型只有正数。
有符号的整型取值范围是
其中n是长度。
另外,isize
和usize
类型依赖运行程序的计算机架构:64 位架构上它们是 64 位的, 32 位架构上它们是 32 位的。
同时也支持用不同的形式表示不同进制的字面量。
数字字面值
例子
Decimal (十进制)
98_222
Hex (十六进制)
0xff
Octal (八进制)
0o77
Binary (二进制)
0b1111_0000
Byte (单字节字符)(仅限于u8
)
b'A'
浮点型
Rust 也有两个原生的浮点数类型,它们是带小数点的数字。Rust 的浮点数类型是f32
和f64
,分别占 32 位和 64 位。浮点数采用 IEEE-754 标准表示。f32
是单精度浮点数,f64
是双精度浮点数。默认类型是f64
,因为在现代 CPU 中,它与f32
速度几乎一样,不过精度更高。所有的浮点型都是有符号的。以下是使用浮点型的实例。
fn main() {
let x = 2.0; // f64
let y: f32 = 3.0; // f32
}
2.字符类型
和C语言一样,char也是Rust的原生类型。但是与之不同的是,Rust的char类型是Unicode的,支持更多的字符,以下是使用字符类型的例子,(如果你能复制到梵文,连梵文也能编码了。)
fn main() {
let c = 'z';
let z: char = '?'; // 指定变量类型
let heart_eyed_cat = '??';
}
要注意分清楚字符和字符串,字符使用的是单引号,字符串使用的是双引号。
3.布尔类型
Rust 中的布尔类型有两个可能的值:true
和false
。Rust 中的布尔类型使用bool
表示。例如:
fn main() {
let t = true;
let f: bool = false; // 指定变量类型
}
四、复合类型
复合类型可以将多个值组合成一个类型。Rust 有两个原生的复合类型:元组(tuple)和数组(array)。
元组
元组是一个将多个其他类型的值组合进一个复合类型的主要方式。可以将多个不同类型的值进行复合,但是元组长度固定:一旦声明,其长度不会增大或缩小。
fn main() {
let tup1 = (500, 6.4, 1);
let tup2: (i32, f64, u8) = (500, 6.4, 1); // 指定类型
}
同时元组也支持解构操作
fn main() {
let tup = (500, 6.4, 1);
let (x, y, z) = tup;
println!("y的值是: {y}");
}
访问元组的值是使用元素在元组中的索引来访问的,索引是从0开始的,与数组是一样的
fn main() {
let x: (i32, f64, u8) = (500, 6.4, 1);
let x1 = x.0;
let x2 = x.1;
let x3 = x.2;
}
数组
与元组不同,数组中的每个元素的类型必须相同。Rust 中的数组与一些其他语言中的数组不同,Rust中的数组长度是固定的。使用方式如下
fn main() {
let a = [1, 2, 3, 4, 5];
let months = ["January", "February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December"];
}
同时也可以指定元素类型
let a: [i32; 5] = [1, 2, 3, 4, 5];
如果初始化数组里面的值都是一样的,那么就有种简便的写法,如下,创建了一个数组a,其中有5个元素,这五个元素都是整数型3
let a = [3; 5];
访问数组中的元素也是同其他编程语言一样
fn main() {
let a = [1, 2, 3, 4, 5];
let a1 = a[0];
let a2 = a[1];
}
但是要注意,不要尝试越界访问数组元素,也就是说,要访问数组长度内的元素。
五、常量
常量与不可变量是类似的,但是是不同的。_常量(constants)_是绑定到一个名称的不允许改变的值。
- 不可变量是默认不可变
- 常量是总是不能变
- 常量可以在任何作用域中声明
- 常量只能被设置为常量表达式,而不可以是其他任何只能在运行时计算出的值
申明一个常量要用const
fn main() {
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
}
总结
以上就是本期所要讲述的内容了。本期主要讲了
- 变量的定义
- 变量的可变性
- 基本变量类型
- 整型
- 布尔型
- 字符型
- 复合型
- 数组
- 元组
- 常量
虽然很努力的组织内容了,但还是感觉不是很合理,在后期一定要调整,方便新手入门,让更多人能够学到Rust。
作业
完成以下作业是你学好rust的重要组成部分。以下题目摘自《Rust练习实践》
变量只有初始化了才可以使用
// 修复下面代码的错误并尽可能少的修改
fn main() {
let x: i32; // 未初始化,但被使用
let y: i32; // 未初始化,也未被使用
println!("x is equal to {}", x);
}
使用mut
将变量标记为可变
// 完形填空,让代码编译
fn main() {
let __ = 1;
__ += 2;
println!("x = {}", x);
}
变量解构
// 修复下面代码的错误并尽可能少的修改
fn main() {
let (x, y) = (1, 2);
x += 2;
assert_eq!(x, 3);
assert_eq!(y, 2);
}
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- 如何通过DBeaver 连接 TDengine?
- Classical Architecture and Memory Classification of Embedded Software Components
- Depth study of 100 cases - convolution neural network (CNN) to realize the clothing image classification
- RICON:NER SOTA 又来!
- Question G: Word Analysis ← Questions for the second provincial competition of the 11th Blue Bridge Cup Competition
- FR9811S6 SOT-23-6 23V,2A同步降压DC/DC转换器
- MapReduce中ETL数据清洗案例
- Who is more popular for hybrid products, depending on technology or market?
- How to retrieve IDC research reports?
- LyScript implements memory stack scanning
猜你喜欢
Cross-chain bridge protocol Nomad suffers hacker attack, losing more than $150 million
Web Server 设置缓存响应字段的一些推荐方案
MySQL数据库实战(1)
使用.NET简单实现一个Redis的高性能克隆版(一)
Generate interface documentation online
RICON:NER SOTA 又来!
Classical Architecture and Memory Classification of Embedded Software Components
苏州大学:从PostgreSQL到TDengine
Lease recovery system based on PHP7.2+MySQL5.7
【多线程的相关内容】
随机推荐
Machine Learning (Chapter 1) - Feature Engineering
代码分析Objective-C中的深拷贝与浅拷贝
干货!一种被称为Deformable Butterfly(DeBut)的高度结构化且稀疏的线性变换
Win10/11 删除文件资源管理器左侧栏目文件夹
This article takes you to understand the principle of CDN technology
袋鼠云思枢:数驹 DTengine,助力企业构建高效的流批一体数据湖计算平台
云原生 Dev0ps 实践
For invoice processing DocuWare, cast off the yoke of the paper and data input, automatic processing all the invoice received
Why is the new earth blurred, in-depth analysis of white balls, viewing pictures, and downloading problems
CADEditorX ActiveX 14.1.X
【AppCube】数字孪生万物可视 | 联接现实世界与数字空间
【文件IO的简单实现】
C#/VB.NET 从PDF中提取表格
[Output each bit of an integer, from high to low.With and without recursion]
Simple implementation of a high-performance clone of Redis using .NET (1)
3分钟实现内网穿透(基于ngrok实现)
微信多开批处理(自动获取安装路径)
【TypeScript】为什么要选择 TypeScript?
程序员架构修炼之道:如何设计出可持续演进的系统架构?
机器学习(第一章)—— 特征工程