【Rust Cookbook系列】十六 操作系统
1. 外部命令 需要安装regex库和error-chain库,可通过cargo add regex和cargo add error-chain 命令安装 [dependencies]regex = "1.8.1"error-chain = "0.12.4" 1.1 运行外部命令并处理 stdout 将 git log --oneline 作为外部命令 Command 运行,并使用 Regex 检查其 Output,以获取最后 5 次提交的哈希值和消息。 use error_chain::error_chain;use regex::Regex;use std::process::Command;error_chain! { foreign_links { Io(std::io::Error); Regex(regex::Error); Utf8(std::string::FromUtf8Error); ...
【Rust Cookbook系列】十五 网络
1. 服务器 1.1 监听未使用的 TCP/IP 端口 实例中,程序将监听显示在控制台上的端口,直到一个请求被发出。当将端口设置为 0 时,SocketAddrV4 会分配一个随机端口。 use std::io::{Error, Read};use std::net::{Ipv4Addr, SocketAddrV4, TcpListener};fn main() -> Result<(), Error> { let loopback = Ipv4Addr::new(127, 0, 0, 1); let socket = SocketAddrV4::new(loopback, 0); let listener = TcpListener::bind(socket)?; let port = listener.local_addr()?; println!("在{}上监听,访问这个端口结束程序", port); let (mut...
【Rust Cookbook系列】十四 内存管理
1. 常量 需要安装lazy_static库,可通过cargo add lazy_static 命令安装 [dependencies]lazy_static = "1.4.0" 1.1 声明延迟计算常量 声明延迟计算的常量 HashMap。HashMap 将被计算一次,随后存储在全局静态(全局堆栈)引用。 use lazy_static::lazy_static;use std::collections::HashMap;lazy_static! { static ref PRIVILEGES: HashMap<&'static str, Vec<&'static str>> = { let mut map = HashMap::new(); map.insert("James", vec!["user", "admin"]); ...
【Rust Cookbook系列】十三 硬件支持
1. 处理器 需要安装num_cpus库,可通过cargo add num_cpus 命令安装 [dependencies]num_cpus = "1.15.0" 1.1 检查逻辑 cpu 内核的数量 使用 [num_cpus::get] 显示当前机器中的逻辑 CPU 内核的数量。 fn main() { println!("逻辑核心数为 {}", num_cpus::get());} 运行cargo run输出 逻辑核心数为 2
【Rust Cookbook系列】十二 文件系统
1. 文件读写 1.1 读取文件的字符串行 向文件写入三行信息,然后使用 BufRead::lines 创建的迭代器 Lines 读取文件,一次读回一行。File 模块实现了提供 BufReader 结构体的 Read trait。File::create 打开文件 File 进行写入,File::open 则进行读取。 use std::fs::File;use std::io::{BufRead, BufReader, Error, Write};fn main() -> Result<(), Error> { let path = "lines.txt"; let mut output = File::create(path)?; write!(output, "Rust\n💖\n呵呵")?; let input = File::open(path)?; let buffered = BufReader::new(input); for...
【Rust Cookbook系列】十一 错误处理
1. 处理错误变量 需要安装error-chain库,可通过cargo add error-chain 命令安装 [dependencies]error-chain = "0.12.4" 1.1 在 main 方法中对错误适当处理 处理尝试打开不存在的文件时发生的错误,是通过使用 error-chain crate 来实现的。error-chain crate 包含大量的模板代码,用于 Rust 中的错误处理。foreign_links 代码块内的 Io(std::io::Error) 函数允许由 std::io::Error 所报错误信息到 error_chain! 所定义错误类型的自动转换,error_chain! 所定义错误类型将实现 Error trait。下文的实例将通过打开 Unix 文件 /proc/uptime 并解析内容以获得其中第一个数字,从而告诉系统运行了多长时间。除非出现错误,否则返回正常运行时间。 use error_chain::error_chain;use std::fs::File;use...
【Rust Cookbook系列】十 编码
1. 字符集 1.1 百分比编码(URL 编码)字符串 需要安装percent-encoding库,可通过cargo add percent-encoding 命令安装 [dependencies]percent-encoding = "2.2.0" 使用 percent-encoding crate 中的 utf8_percent_encode 函数对输入字符串进行百分比编码(URL 编码)。解码使用 percent_decode 函数。编码集定义哪些字节(除了非 ASCII 字节和控制键之外)需要进行百分比编码(URL 编码),这个集合的选择取决于上下文。例如,url对 URL 路径中的 ? 编码,而不对查询字符串中的 ? 编码。编码的返回值是 &str 切片的迭代器,然后聚集为一个字符串 String。 use percent_encoding::{percent_decode, utf8_percent_encode, AsciiSet, CONTROLS};use std::str::Utf8Error;///...
【Rust Cookbook系列】九 开发工具
1. 调试工具 1.1 日志信息 需要安装log、env_logger2个库,可通过cargo add log、cargo add env_logger命令安装 [dependencies]env_logger = "0.10.0" # 半年未更新log = "0.4.17" # 一年未更新 1.1.1 记录调试信息到控制台 log crate 提供了日志工具,env_logger crate 通过环境变量配置日志记录。log::debug! 宏的工作方式类似于其它 std::fmt 格式化的字符串。 fn execute_query(query: &str) { log::debug!("执行操作: {}", query);}fn main() { env_logger::init(); execute_query("删除学生表");} 运行RUST_LOG=debug cargo...
【Rust Cookbook系列】八 日期与时间
1. 期间和计算 1.1 测量运行时间 测量从 time::Instant::now 开始运行的时间 time::Instant::elapsed。调用 time::Instant::elapsed 将返回 time::Duration,在实例末尾打印该时间。此方法不会更改或者重置 time::Instant 对象。 use std::thread;use std::time::{Duration, Instant};fn expensive_function() { thread::sleep(Duration::from_secs(2));}fn main() { let start = Instant::now(); expensive_function(); let duration = start.elapsed(); println!("expensive_function() 函数运行的时间是: {:?}",...
【Rust Cookbook系列】七 数据库
1. SQLite 需要安装rusqlite库,可通过cargo add rusqlite --features bundled 命令安装 [dependencies]rusqlite = { version = "0.29.0", features = ["bundled"] } 1.1 创建 SQLite 数据库 使用rusqlite crate 打开 SQLite 数据库连接。如果数据库不存在,Connection::open方法将创建它。 // use rusqlite::NO_PARAMS; 已弃用:改用空数组;stmt.execute(NO_PARAMS) => stmt.execute([])use rusqlite::{Connection, Result};fn main() -> Result<()> { let conn = Connection::open("cats.db")?; ...