• Rust编程-I/O


    文件读取:

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

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

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

    1. // main.rs
    2. use std::env;
    3. use minigrep::{run,Config};
    4. use std::process;
    5. fn main() {
    6. let args:Vec<String> = env::args().collect();
    7. let config:Config = Config::new(&args).unwrap_or_else(|err|{
    8. println!("Problem parsing arguments:{}",err);
    9. process::exit(1);
    10. });
    11. if let Err(e) = run(config){
    12. println!("Application error:{}",e);
    13. process::exit(1);
    14. }
    15. }
    16. // lib.rs
    17. use std::fs;
    18. use std::error::Error;
    19. pub fn run(config:Config) -> Result<(),Box<dyn Error>>{
    20. let contents = fs::read_to_string(config.filename)?;
    21. println!("With text:\n{}",contents);
    22. Ok(())
    23. }
    24. pub struct Config{
    25. query:String,
    26. filename:String,
    27. }
    28. impl Config{
    29. pub fn new(args:&[String]) -> Result'static str>{ //&'static str
    30. if args.len() < 3{
    31. return Err("not enough arguments");
    32. }
    33. let query = args[1].clone();
    34. let filename = args[2].clone();
    35. Ok(Config{
    36. query,
    37. filename
    38. })
    39. }
    40. }

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

    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表达式。因为,这里只考虑一种情况,就是发生异常的情况的处理。

    总结:

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

           

                    

            

  • 相关阅读:
    日语 11 12
    【JAVA学习笔记】38 - 单例设计模式-静态方法和属性的经典使用
    HTML5 Canvas
    【Unity3D】Shader Graph简介
    已解决xlrd.biffh.XLRDError: Excel xlsx file; not supported
    Pytorch代码入门学习之分类任务(三):定义损失函数与优化器
    STM32CUBEIDE(14)----外部中断EXTI
    hjr-大数据 关于分库分表
    常用的git指令
    电脑死机的时候,发生了什么?
  • 原文地址:https://blog.csdn.net/Mercuryyjs/article/details/140312837