当前位置:网站首页>【一起学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开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
猜你喜欢

fast planner中拓扑路径搜索

【JS 逆向百例】某网站加速乐 Cookie 混淆逆向详解

二叉搜索树(搜索二叉树)模拟实现(有递归版本)

complete knapsack problem

For invoice processing DocuWare, cast off the yoke of the paper and data input, automatic processing all the invoice received

Skills required to be a good architect: How to draw a system architecture that everyone will love?What's the secret?Come and open this article to see it!...

用于发票处理的 DocuWare,摆脱纸张和数据输入的束缚,自动处理所有收到的发票
![[Bubble sort and odd-even sorting]](/img/89/d63afe1900a05b2a5615fcc3c09ccb.png)
[Bubble sort and odd-even sorting]

SmobilerService 推送实现

图新地球为什么很模糊,白球、看图、下载问题深度剖析
随机推荐
在线生成接口文档
Objective - C code analysis of the deep and shallow copy
【二分查找详解外加递归写法】附有全部代码
redis基础知识总结——数据类型(字符串,列表,集合,哈希,集合)
【JS 逆向百例】某网站加速乐 Cookie 混淆逆向详解
MySQL数据库基本使用
Web Server 设置缓存响应字段的一些推荐方案
深度学习100例——卷积神经网络(CNN)实现服装图像分类
使用.NET简单实现一个Redis的高性能克隆版(一)
下午见!2022京东云数据库新品发布会
机器学习概述
2022年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多
fast planner中拓扑路径搜索
赛灵思MPSOC裸机下的 USB调试实验
成为优秀架构师必备技能:怎样才能画出让所有人赞不绝口的系统架构图?秘诀是什么?快来打开这篇文章看看吧!...
Machines need tokens more than people
87.(cesium之家)cesium热力图(贴地形)
complete knapsack problem
【JDBC以及内部类的讲解】
Generate interface documentation online
