运维.售后
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
博客
Blog
ToB门户
了解全球最新的ToB事件
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
Rust常见编程概念
Rust常见编程概念
守听
金牌会员
|
2024-3-21 10:08:07
|
显示全部楼层
|
阅读模式
楼主
主题
892
|
帖子
892
|
积分
2676
目录
变量和可变性
常量
隐藏
数据类型
标量类型
整型
浮点型
布尔型
字符类型
复合类型
元组类型
数组类型
访问数组元素
无效的数组元素访问
函数
参数
语句和表达式
具有返回值的函数
注释
控制流
if 表达式
使用 else if 处理多重条件
在 let 语句中使用 if
使用循环重复执行
使用 loop 重复执行代码
从循环返回值
循环标签:在多个循环之间消除歧义
while 条件循环
使用 for 遍历集合
本文大部分内容来自官方文档,对于一些基础常识的内容做了删减,适合已经掌握其它编程语言的人查阅,原文档内容参考
常见编程概念
。
变量和可变性
变量
默认是不可变的,可以在变量名前添加
mut
来使其可变。
示例代码:
fn main() {
//let x = 5; 默认不可变,编译报错
let mut x = 5;
println!("The value of x is: {x}");
x = 6;
println!("The value of x is: {x}");
}
复制代码
常量
类似于不可变变量,
常量 (constants)
是绑定到一个名称的不允许改变的值,常量与变量的区别:
不允许对常量使用 mut
,常量不光默认不可变,它总是不可变。
声明常量使用
const 关键字而不是 let
,并且
必须注明值的类型
。
常量
可以在任何作用域中声明
,包括全局作用域。
常量
只能被设置为常量表达式
,而不可以是其他任何只能在运行时计算出的值。
示例代码:
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
复制代码
Rust 对常量的命名约定是在单词之间使用全大写加下划线
,编译器能够在编译时计算一组有限的操作。
在声明它的作用域之中,常量在整个程序生命周期中都有效
,将硬编码值声明为常量有助于后期代码维护。
隐藏
可以用相同变量名称来隐藏一个变量,以及重复使用 let 关键字来多次隐藏
,如下所示:
fn main() {
//将 x 绑定到值 5 上
let x = 5;
//创建了一个新变量 x
let x = x + 1;
{
//创建了一个新变量 x
let x = x * 2;
println!("The value of x in the inner scope is: {x}");
//输出 The value of x in the inner scope is: 12
}
println!("The value of x is: {x}");
//输出 The value of x is: 6
}
复制代码
隐藏与将变量标记为 mut 是有区别的
:
对变量重新赋值时不使用 let 关键字会导致编译时错误
,通过使用 let 可以用这个值进行一些计算,
计算完之后变量仍然是不可变的
。
当再次使用 let 时,实际上创建了一个新变量,我们可以改变值的类型,并且复用这个名字,例如:
//字符串类型
let spaces = " ";
//数字类型
let spaces = spaces.len();
复制代码
隐藏使我们不必使用不同的名字
,如 spaces_str 和 spaces_num。
下面这种代码会报错,不能改变变量的类型:
let mut spaces = " ";
spaces = spaces.len();
复制代码
注:不要滥用隐藏特性,
被隐藏变量和新变量尽量处于同一个作用域
。
数据类型
每一个值都属于某一个
数据类型(data type)
,有两类数据类型子集:
标量(scalar)
和
复合(compound)
。
Rust 是
静态类型(statically typed)
语言,编译时就必须知道所有变量的类型。
根据值及其使用方式,编译器通常可以推断出我们想要用的类型:
当多种类型均有可能时必须增加类型注解,例如:
let guess: u32 = "42".parse().expect("Not a number!");
复制代码
标量类型
标量
(scalar)类型
代表一个单独的值
,Rust 有四种基本的标量类型:
整型
、
浮点型
、
布尔类型
和
字符类型
。
整型
整数
是一个没有小数部分的数字,Rust 内建的整数类型如下:
长度有符号无符号8-biti8u816-biti16u1632-biti32u3264-biti64u64128-biti128u128archisizeusize可以使用其中的任一个来声明一个整数值的类型,类型取值范围如下(n 是变体使用的位数):
有符号的变体可以储存包含从 -(2ⁿ⁻¹) 到 2ⁿ⁻¹ - 1 的数字,如 i8 可以储存从 -(2⁷) 到 2⁷ - 1 的数字,也就是从 -128 到 127。
无符号的变体可以储存从 0 到 2ⁿ - 1 的数字,如 u8 可以储存从 0 到 2⁸ - 1 的数字,也就是从 0 到 255。
isize 和 usize 类型依赖运行程序的计算机架构
:64 位架构上它们是 64 位的,32 位架构上它们是 32 位的。
可以使用下表中的任何一种形式编写数字字面值:
数字字面值例子Decimal (十进制)98_222Hex (十六进制)0xffOctal (八进制)0o77Binary (二进制)0b1111_0000Byte (单字节字符)(仅限于u8)b'A'
可以是多种数字类型的数字字面值
允许使用类型后缀
,例如 57u8 来指定类型;
允许使用 _ 做为分隔符以方便读数
,例如1_000 的值与 1000 相同。
如果不知道使用哪种类型的数字,可以使用 Rust 的默认类型,
数字类型默认是 i32
,
isize 或 usize 主要作为某些集合的索引
。
关于整型溢出的处理:
当在 debug 模式编译时,Rust 检查这类问题并使程序 panic
,这个术语被 Rust 用来表明程序因错误而退出。
使用 --release flag
在 release 模式中构建时,Rust 不会检测会导致 panic 的整型溢出
。发生整型溢出时会进行二进制补码操作,值 256 变成 0,值 257 变成 1,依此类推。
为了显式地处理溢出的可能性,可以使用这几类标准库提供的原始数字类型方法:
所有模式下都可以使用 wrapping_* 方法进行 wrapping,如 wrapping_add
如果 checked_* 方法出现溢出,则返回 None值
用 overflowing_* 方法返回值和一个布尔值,表示是否出现溢出
用 saturating_* 方法在值的最小值或最大值处进行饱和处理
浮点型
Rust 也有两个原生的
浮点数
(floating-point numbers)类型,分别是
f32
和
f64
,分别占 32 位和 64 位,
默认类型是 f64
:
fn main() {
let x = 2.0; // f64
let y: f32 = 3.0; // f32
}
复制代码
浮点数采用 IEEE-754 标准表示,
f32 是单精度浮点数,f64 是双精度浮点数
。
注:Rust 中的所有数字类型都支持基本数学运算:加法、减法、乘法、除法和取余,
整数除法会向零舍入到最接近的整数
。
布尔型
Rust 中的布尔类型有两个可能的值:true 和 false,使用 bool 表示:
fn main() {
let t = true;
let f: bool = false;
}
复制代码
字符类型
Rust 的
char
类型是语言中最原生的字母类型:
[code]fn main() { //单引号声明 char 字面量,双引号声明字符串字面量 let c = 'z'; let z: char = 'ℤ'; let heart_eyed_cat = '
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
守听
金牌会员
这个人很懒什么都没写!
楼主热帖
【网络编程】从零开始搭建一个开源博客 ...
Vulnhub靶机-Al-Web-1
报错building for iOS Simulator, but ...
Python学习:import的正确用法
【CSDN云VS腾讯云】要不然怎么说CSDN开 ...
面试官:BIO、NIO、AIO是什么,他们有 ...
全网最新的nacos 2.1.0集群多节点部署 ...
TCP协议
UWP/WinUI3 Win2D PixelShaderEffec ...
如何成为一名开发人员——第 3 部分: ...
标签云
存储
服务器
快速回复
返回顶部
返回列表