当前位置: 首页 > news >正文

Rust编程-I/O

文件读取:

        依赖:标准库中use std::fs; 模块

        读取文件:fs::read_to_string(filepath:string) -> Result<String> String是文件内容

        下面代码来自《Rust权威指南》,主要作用是从文件中检索,并返回检索内容所在的行:

// main.rs
use std::env;
use minigrep::{run,Config};
use std::process;fn main() {let args:Vec<String> =  env::args().collect();let config:Config = Config::new(&args).unwrap_or_else(|err|{println!("Problem parsing arguments:{}",err);process::exit(1);});if let Err(e) = run(config){println!("Application error:{}",e);process::exit(1);}
}// lib.rs
use std::fs;
use std::error::Error;pub fn run(config:Config) -> Result<(),Box<dyn Error>>{let contents = fs::read_to_string(config.filename)?;println!("With text:\n{}",contents);Ok(())
}pub struct Config{query:String,filename:String,
}impl Config{pub fn new(args:&[String]) -> Result<Config,&'static str>{ //&'static strif args.len() < 3{return Err("not enough arguments");  }let query = args[1].clone();let filename = args[2].clone();Ok(Config{query,filename})}
}

        这段代码是重构后的。其实,是对基础知识引用的综合展示。下面,分析下这段代码:

lib.rs里存放的是业务逻辑,业务逻辑分两块run函数和Config结构体:

        Config结构体:

                两个属性:query和filename,

                结构体关联函数:new函数参数不带&self或self,因此它是一个关联函数。参数是args,类型是字符串切片。函数的返回类型是Result枚举,如果函数执行正常则返回Ok(Config),如果函数发生了panic,则返回Err(&' static str)。其中,static是静态生命周期,表示程序运行期间它都有效,而字符串切片是直接存放在编译后的二进制文件中的,因此它拥有static生命周期。

                为什么采用结构体,而不是元组等其他数据结构,是因为Config结构体能够将query和filename关联起来。这种关联关系是从业务角度出发考虑的。

                对于异常,new函数采用的是return的方式,这样可以让上层调用者自行选择如何处理异常。Rust中向上抛出异常还有?表达式,能够简化处理。这里做下回顾。

       run函数:

                主要作用是从文件中读取内容,并返回。函数参数是config,这里没有使用借用。因此,函数获取了config的所有权。

                读取文件的I/O函数是std::fs模块,函数是read_to_string(),参数是文件路径。该函数返回值的类型是Result枚举。这里直接使用?,将panic抛给使用者。

      main函数:

                env模块用于获取控制台I/O的输入命令的参数。

                collect()函数能够实现对数据结构的类型转换。通过变量上指定数据结构类型来实现。

                config()函数后面使用了unwrap_or_else(), 函数参数是闭包。new函数如果返回异常,这里通过unwrap_or_else来实现对异常的处理。其他可以使用的方法有unwrap()、expect(xxx)、map_err()。这里做下知识回顾。

                run函数这里使用了let  if 表达式,该表达式用于替换match表达式。因为,这里只考虑一种情况,就是发生异常的情况的处理。

总结:

        该代码实例是对之前所有基础知识的应用,非常好的例子。如果代码都能理解了,表示基础已经大部分掌握了。

       

                

        

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 算法刷题笔记 合并集合(C++实现)
  • TensorBoard ,PIL 和 OpenCV 在深度学习中的应用
  • python--实验 11 模块
  • Qt+ESP32+SQLite 智能大棚
  • 6-5,web3浏览器链接区块链(react+区块链实战)
  • OpenCV解决验证码(数字和字母)识别(Python)
  • 了解redis
  • YOLOv5和LPRNet的车牌识别系统
  • Java二十三种设计模式-单例模式(1/23)
  • mysql不初始化升级
  • ArcGIS识别不GDB文件地理数据库显示为空?
  • Java异常体系、UncaughtExceptionHandler、Spring MVC统一异常处理、Spring Boot统一异常处理
  • Django前后端打通
  • 基于机器学习的锂离子电池容量估计(MATLAB R2021B)
  • 深度学习基础:Numpy 数组包
  • extjs4学习之配置
  • Js基础知识(四) - js运行原理与机制
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • node-glob通配符
  • node学习系列之简单文件上传
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • React-Native - 收藏集 - 掘金
  • STAR法则
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 回流、重绘及其优化
  • 如何优雅地使用 Sublime Text
  • 深入 Nginx 之配置篇
  • 什么是Javascript函数节流?
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 移动端 h5开发相关内容总结(三)
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • ‌JavaScript 数据类型转换
  • !$boo在php中什么意思,php前戏
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #android不同版本废弃api,新api。
  • #define、const、typedef的差别
  • #Linux(帮助手册)
  • #QT(串口助手-界面)
  • #考研#计算机文化知识1(局域网及网络互联)
  • (0)Nginx 功能特性
  • (a /b)*c的值
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (离散数学)逻辑连接词
  • (六)软件测试分工
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (五)关系数据库标准语言SQL
  • (一)基于IDEA的JAVA基础10
  • (转)linux 命令大全
  • (转)Sublime Text3配置Lua运行环境