构建一个单线程Web服务器 Web服务器涉及的两个主要协议是超文本传输协议(HTTP)和传输控制协议(TCP)。 监听TCP连接 use std::net::TcpListener; fn main() { let listener = TcpListener::bind("127.0.0.1:7878").unwrap(); for stream in listener.incoming() { let stream = stream.unwrap(); println…
构建一个单线程Web服务器 Web服务器涉及的两个主要协议是超文本传输协议(HTTP)和传输控制协议(TCP)。 监听TCP连接 use std::net::TcpListener; fn main() { let listener = TcpListener::bind("127.0.0.1:7878").unwrap(); for stream in listener.incoming() { let stream = stream.unwrap(); println…
rust高级特征 Unsafe Rust Unsafe Rust(Unsafe Rust)是Rust编程语言中的一种特性,它允许程序员绕过Rust的内存安全性,执行一些可能不安全的操作,它的存在主要有以下两个重要意义: 灵活性和控制力:Rust的设计目标之一是提供内存安全性和线程安全性,以避免常见的程序错误,如空指针引用和数据竞争。然而,有些情况下,程序员需要执行一些底层、不安全的操作,例如直接操作内存、调用未经验证的外部函数或与底层硬件进行交互。不安全Rust允许程序员在这些情况下绕过编译器的检查,以完成特定任务…
模式是一种特殊的语法,用于匹配不同类型的结构,可以是简单的也可以是复杂的。通过将模式与匹配表达式等结构相结合,可以更好地控制程序的控制流。模式可以由以下部分组成: 字面量:匹配特定的常量值。 解构的数组、枚举、结构或元组:从中提取值以进行匹配。 变量:将匹配的部分绑定到变量,以便在代码中使用。 通配符:用于匹配任意值,不关心具体内容。 占位符:类似于通配符,但可以将匹配的部分绑定到特定变量。 所有可能会用到模式的位置 match分支 在形式上 match 表达式由 match 关键字、用于匹配的值和一个或多个分支构…
Rust 的面向对象编程特性 面向对象编程(Object-Oriented Programming,OOP)是一种模式化编程方式。 面向对象语言的特点 Rust 受到许多编程范式的影响,例如:函数式编程的特性,面向对象编程(OOP)。面向对象编程语言共享某些共同特性,即对象、封装和继承。 对象:数据和行为的集合体 《设计模式:可复用面向对象软件的基础》中面向对象编程的定义:Object-oriented programs are made up of objects. An object packages both…
Rust 的主要目标之一是处理并发编程,保证程序的内存安全和高效运行。通过利用 Rust 的所有权和类型检查系统,使许多并发错误可以在编译时检测到,从而避免了运行时错误。Rust 的 无畏并发(fearless concurrency) 使得编写代码变得更加容易,而且易于重构,不会引入新的错误。 使用线程同时运行代码 Rust 中的线程(threads)是用于同时运行程序中独立部分的功能。在多线程上下文中编程需要仔细思考,因为线程可以同时运行,所以不同线程上代码的运行顺序无法预知,可能会导致问题,例如竞争状态(线程…
指针是一个通用概念,指的是一个包含内存地址的变量,这个地址指向或者“指向”其他数据。在 Rust 中,最常见的指针是引用(reference),它使用 & 符号表示,并且借用它所指向的值。引用没有任何特殊的功能,除了指向数据之外,并且没有开销。 智能指针是数据结构,它的行为类似于指针,但也具有附加的元数据和功能。智能指针的概念并不局限于 Rust:智能指针起源于 C++,并且在其他语言中也存在。Rust 在标准库中定义了各种智能指针,提供了比引用更多的功能。为了探讨智能指针的一般概念,我们将看几个不同的智能…
Cargo 的一些更高级的功能: 通过发布配置文件自定义您的构建过程 在 crates.io 上发布库 使用工作区组织大型项目 从 crates.io 安装二进制文件 使用自定义命令扩展 Cargo 自定义release配置文件 在 Rust 中,发布配置是预定义的可自定义配置文件,具有不同的配置,允许程序员更好地控制编译代码的各种选项。每个配置文件都是独立配置的。 Cargo 有两个主要的配置文件:当运行 cargo build 时使用的 dev 配置文件和当运行 cargo build --release 时使…
Rust的设计灵感来自许多现有的语言和技术,其中一个重要的影响是函数式编程。函数式编程风格通常包括将函数作为值使用,方法包括在参数中传递它们、从其他函数返回它们、将它们分配给变量以供以后执行等等。 rust的主要特征与函数式的特性相似: 闭包(Closures):一种类似于函数的构造,可以存储在变量中。 迭代器(Iterators):一种处理一系列元素的方法。 如何使用闭包和迭代器来改进第 12 章中的 I/O 项目。 闭包和迭代器的性能(剧透:它们比你想象的要快!)。 其他的 Rust 特性,例如模式匹配和枚举类…
Accepting Command Line Arguments 创建一个项目(minigrep),接受两个命令行参数:文件路径和要搜索的字符串。 读取参数值 需要std::env::args来读取命令行参数的值。此函数返回一个命令行参数的迭代器给minigrep。 迭代器:1.迭代器生成一系列值。2.我们可以调用迭代器上的collect方法将其转换为包含迭代器生成的所有元素的集合,例如vector。 在需要的函数嵌套在多个模块中的情况下,选择将父模块而不是函数引入作用域。这样可以使用std::env中的其他函数。…
How to Write Tests 测试函数的主体通常执行以下三个操作: 1.设置任何需要的数据或状态。 2.运行要测试的代码。 3.断言的结果是你所期望的。 Rust专门为编写执行这些操作的测试提供的特性,其中包括test属性、一些宏和should_panic属性。 测试函数解剖 最简单情况下,rust中的测试是一个用test属性注释的函数。属性是关于 Rust 代码片段的元数据(derive 也是一个属性);再要测试的函数(fn)前,添加#[test]。使用cargo test,Rust会构建一个测试运行程序…