Rust数据类型
Rust 数据类型Rust 语言中的基础数据类型有以下几种。整数型(Integer)整数型简称整型,按照比特位长度和有无符号分为以下种类: 位长度 有符号 无符号 8-bit i8 u8 16-bit i16 u16 32-bit i32 u32 64-bit i64 u64 128-bit i128 u128 arch isize usize isize 和 usize 两种整数类型是用来衡量数据大小的,它们的位长度取决于所运行的目标平台,如果是 32 位架构的处理器将使用 32 位位长度整型。整数的表述方法有以下几种: 进制 例 十进制 98_222 十六进制 0xff ...
Rust教程
Rust 教程 Rust 是由 Mozilla 主导开发的高性能编译型编程语言,遵循”安全、并发、实用”的设计原则。 Rust 语言由 Mozilla 开发,首次发布于 2010 年。Rust 支持多种编程范式,包括函数式、并发式、过程式和面向对象风格。Rust 速度惊人且内存利用率极高。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成。Rust 系列文章内容由 Sobin 收集整理。 Rust 语言的特点 内存安全:Rust 的所有权系统在编译时防止空悬指针、数据竞争等内存错误,无需垃圾收集器。 并发编程:Rust 提供了现代的语言特性来支持并发编程,如线程和消息传递,使得编写并发程序更加安全和容易。 性能:Rust 编译为机器码,没有运行时或垃圾收集器,能够提供接近 C 和 C++ 的性能。 类型系统:Rust 的类型系统和模式匹配提供了强大的抽象能力,有助于编写更安全、更可预测的代码。 错误处理:Rust 的错误处理模型鼓励显式处理所有可能的错误情况。 宏系统:Rust...
Rust所有权
Rust 所有权计算机程序必须在运行时管理它们所使用的内存资源。大多数的编程语言都有管理内存的功能:C/C++ 这样的语言主要通过手动方式管理内存,开发者需要手动的申请和释放内存资源。但为了提高开发效率,只要不影响程序功能的实现,许多开发者没有及时释放内存的习惯。所以手动管理内存的方式常常造成资源浪费。Java 语言编写的程序在虚拟机(JVM)中运行,JVM 具备自动回收内存资源的功能。但这种方式常常会降低运行时效率,所以 JVM 会尽可能少的回收资源,这样也会使程序占用较大的内存资源。所有权对大多数开发者而言是一个新颖的概念,它是 Rust 语言为高效使用内存而设计的语法机制。所有权概念是为了让 Rust 在编译阶段更有效地分析内存资源的有用性以实现内存管理而诞生的概念。所有权规则所有权有以下三条规则: Rust 中的每个值都有一个变量,称为其所有者。一次只能有一个所有者。当所有者不在程序运行范围时,该值将被删除。这三条规则是所有权概念的基础。接下来将介绍与所有权概念有关的概念。变量范围我们用下面这段程序描述变量范围的概念:{ //...
Rust循环
Rust 循环 Rust 除了灵活的条件语句以外,循环结构的设计也十分成熟。这一点作为身经百战的开发者应该能感觉出来。while 循环while 循环是最典型的条件语句循环:实例fn main() { let mut number = 1; while number != 4 { println!(“{}”, number); number += 1; } println!(“EXIT”);} 运行结果:123EXITRust 语言到此教程编撰之日还没有 do-while 的用法,但是 do 被规定为保留字,也许以后的版本中会用到。在 C 语言中 for 循环使用三元语句控制循环,但是 Rust 中没有这种用法,需要用 while 循环来代替:C 语言int i;for (i = 0; i < 10; i++) { // 循环体} Rustlet mut i = 0;while i < 10 { //...
Rust异步编程asyncawait
Rust 异步编程 async/await在现代编程中,异步编程变得越来越重要,因为它允许程序在等待 I/O 操作(如文件读写、网络通信等)时不被阻塞,从而提高性能和响应性。 异步编程是一种在 Rust 中处理非阻塞操作的方式,允许程序在执行长时间的 I/O 操作时不被阻塞,而是在等待的同时可以执行其他任务。Rust 提供了多种工具和库来实现异步编程,包括 async 和 await 关键字、futures 和异步运行时(如 tokio、async-std 等),以及其他辅助工具。 Future:Future 是 Rust 中表示异步操作的抽象。它是一个可能还没有完成的计算,将来某个时刻会返回一个值或一个错误。 async/await:async 关键字用于定义一个异步函数,它返回一个 Future。await 关键字用于暂停当前 Future 的执行,直到它完成。 实例 以下实例展示了如何使用 async 和 await 关键字编写一个异步函数,以及如何在异步函数中执行异步任务并等待其完成。实例//...
Rust并发编程
Rust 并发编程安全高效的处理并发是 Rust 诞生的目的之一,主要解决的是服务器高负载承受能力。并发(concurrent)的概念是指程序不同的部分独立执行,这与并行(parallel)的概念容易混淆,并行强调的是”同时执行”。并发往往会造成并行。本章讲述与并发相关的编程概念和细节。线程线程(thread)是一个程序中独立运行的一个部分。线程不同于进程(process)的地方是线程是程序以内的概念,程序往往是在一个进程中执行的。在有操作系统的环境中进程往往被交替地调度得以执行,线程则在进程以内由程序进行调度。由于线程并发很有可能出现并行的情况,所以在并行中可能遇到的死锁、延宕错误常出现于含有并发机制的程序。为了解决这些问题,很多其它语言(如 Java、C#)采用特殊的运行时(runtime)软件来协调资源,但这样无疑极大地降低了程序的执行效率。C/C++ 语言在操作系统的最底层也支持多线程,且语言本身以及其编译器不具备侦察和避免并行错误的能力,这对于开发者来说压力很大,开发者需要花费大量的精力避免发生错误。Rust 不依靠运行时环境,这一点像 C/C++...
Rust宏
Rust 宏Rust 宏(Macros)是一种在编译时生成代码的强大工具,它允许你在编写代码时创建自定义语法扩展。宏(Macro)是一种在代码中进行元编程(Metaprogramming)的技术,它允许在编译时生成代码,宏可以帮助简化代码,提高代码的可读性和可维护性,同时允许开发者在编译时执行一些代码生成的操作。宏在 Rust 中有两种类型:声明式宏(Declarative Macros)和过程宏(Procedural Macros)。本文主要介绍声明式宏。宏的定义在 Rust 中,使用 macro_rules! 关键字来定义声明式宏。macro_rules! my_macro { // 模式匹配和展开 ($arg:expr) => { // 生成的代码 // 使用 $arg 来代替匹配到的表达式 };}声明式宏使用 macro_rules! 关键字进行定义,它们被称为 “macro_rules”...
Rust基础语法
Rust 基础语法变量,基本类型,函数,注释和控制流,这些几乎是每种编程语言都具有的编程概念。这些基础概念将存在于每个 Rust 程序中,及早学习它们将使你以最快的速度学习 Rust 的使用。变量首先必须说明,Rust 是强类型语言,但具有自动判断变量类型的能力。这很容易让人与弱类型语言产生混淆。默认情况下,Rust 中的变量是不可变的,除非使用 mut 关键字声明为可变变量。 let a = 123; // 不可变变量let mut b = 10; // 可变变量如果要声明变量,需要使用 let 关键字。例如:let a = 123;只学习过 JavaScript 的开发者对这句话很敏感,只学习过 C 语言的开发者对这句话很不理解。在这句声明语句之后,以下三行代码都是被禁止的:a = “abc”;a = 4.56;a = 456;第一行的错误在于当声明 a 是 123 以后,a...
Rust函数
Rust 函数函数在 Rust 语言中是普遍存在的。通过之前的章节已经可以了解到 Rust 函数的基本形式:fn <函数名> ( <参数> ) <函数体>其中 Rust 函数名称的命名风格是小写字母以下划线分割:实例fn main() { println!(“Hello, world!”); another_function();} fn another_function() { println!(“Hello, runoob!”);} 运行结果:Hello, world!Hello, runoob!注意,我们在源代码中的 main 函数之后定义了another_function。 Rust不在乎您在何处定义函数,只需在某个地方定义它们即可。函数参数Rust 中定义函数如果需要具备参数必须声明参数名称和类型:实例fn main() { another_function(5, 6);} fn another_function(x: i32, y: i32) { println!(“x 的值为 : {}”, x); ...
RustSlice(切片)类型
Rust Slice(切片)类型切片(Slice)是对数据值的部分引用。切片这个名字往往出现在生物课上,我们做样本玻片的时候要从生物体上获取切片,以供在显微镜上观察。在 Rust 中,切片的意思大致也是这样,只不过它从数据取材引用。字符串切片最简单、最常用的数据切片类型是字符串切片(String Slice)。实例fn main() { let s = String::from(“broadcast”); let part1 = &s[0..5]; let part2 = &s[5..9]; println!(“{}={}+{}”, s, part1, part2);} 运行结果:broadcast=broad+cast 上图解释了字符串切片的原理(注:Rust 中的字符串类型实质上记录了字符在内存中的起始位置和其长度,我们暂时了解到这一点)。使用 .. 表示范围的语法在循环章节中出现过。x..y 表示 [x, y) 的数学含义。.. 两边可以没有运算数:..y 等价于 0..yx.....