当前位置:网站首页>【一起学Rust | 基础篇】Rust基础——变量和数据类型
【一起学Rust | 基础篇】Rust基础——变量和数据类型
2022-07-29 11:41:00 【广龙宇】

目录
前言
经过前面几期的学习,大家应该对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);
}
边栏推荐
- 【Unity3D】场景切换、退出全屏、退出游戏
- [image processing] image skeleton extraction based on central axis transformation with matlab code
- Lucky draw system with background source code
- 什么是 Kubernetes 自定义资源定义 (CRD)?
- CSDN TOP1“一个处女座的程序猿“如何通过写作成为百万粉丝博主
- Basic. Blocking
- ️ 炒 股 实 战丨原 地 起 飞 ️
- 7月3日文: 表面上有危险,实属安全周期,大概率会快速上扬的个股
- 面试官培训课件(非常实用的企业内训课件)
- Hutool日期时间
猜你喜欢

【Unity3D】角色控制器(CharacterController)

一次node文件操作过多排查过程总结

2022 latest WiFi master applet independent version 3.0.8

QML(二):设置自定义窗体

8. Interleave - understand ThreadPoolExecutor thread pool from architecture design to practice

谷歌“消灭” Cookie 计划延至 2024 年

KRYSTAL:审计数据中基于知识图的战术攻击发现框架

std::vector 拷贝、追加、嵌套访问

如何使用“COPY –link”加速 Docker 构建和优化缓存

AI全流程开发难题破解之钥
随机推荐
MFC学习备忘
基本.分块
3.认识和操作一下mysql的基本命令
使用Tenserboard可视化深度学习训练过程
golang 实现文件上传下载
Applied practical skills of deep reinforcement learning
593. 有效的正方形 : 简单几何运用题
『面试知识集锦100篇』1.面试技巧篇丨HR的小心思,你真的懂吗?
[SwiftUI 开发] @State @Binding @ObservedObject @EnvironmentObject
IPv6 Foundation
Talk about the establishment of performance testing environment
深入理解C# 进入快速通道的委托
Hutool日期时间
Learning with Recoverable Forgetting阅读心得
SkiaSharp of WPF custom painting to bounce ball (case)
【Unity3D】角色控制器(CharacterController)
INVALID_ARGUMENT : Invalid rank for input: modelInput Got: 3 Expected: 4 Please fix either the input
[image detection] Research on cumulative weighted edge detection method based on gray image, with matlab code
2.安装MySQL
"100 Interview Knowledge Collections" 1. Interview Skills丨Do you really understand HR's careful thinking?
