购物网站,购物车界面如何做,做PPT参考图片网站 知乎,用wordpress做微博,简单网站页面文件读取: 依赖#xff1a;标准库中use std::fs; 模块 读取文件#xff1a;fs::read_to_string(filepath:string) - ResultString String是文件内容 下面代码来自《Rust权威指南》#xff0c;主要作用是从文件中检索#xff0c;并返回检索内容所在的行#xf…文件读取: 依赖标准库中use std::fs; 模块 读取文件fs::read_to_string(filepath:string) - ResultString String是文件内容 下面代码来自《Rust权威指南》主要作用是从文件中检索并返回检索内容所在的行
// main.rs
use std::env;
use minigrep::{run,Config};
use std::process;fn main() {let args:VecString 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(),Boxdyn 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]) - ResultConfig,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表达式。因为这里只考虑一种情况就是发生异常的情况的处理。 总结 该代码实例是对之前所有基础知识的应用非常好的例子。如果代码都能理解了表示基础已经大部分掌握了。