首页 > 其他分享 >23_rust_练习

23_rust_练习

时间:2023-11-05 23:57:12浏览次数:38  
标签:练习 23 read args filename let env query rust

练习编码

实现一个简单的grep工具。
建立项目:

> cargo new minigrep
Created binary (application) `minigrep` package

接收命令行参数

use std::env;

fn main() {
    // args返回一迭代器,collect将迭代器转换为Vector,需指明类型
    // args函数无法处理非法Unicode字符,如果输入了非法unicode字符则panic
    let args : Vec<String> = env::args().collect();
    // 如果要接收非法Unicode字符,需要使用env::args_os(), 这个返回的是OsString
    println!("{:?}", args);
    let query = &args[1];
    let filename = &args[2];
    println!("{}, {}", query, filename);
}

读取文件

use std::env;
use std::fs; // 处理与文件相关的事务

fn main() {
    // args返回一迭代器,collect将迭代器转换为Vector,需指明类型
    // args函数无法处理非法Unicode字符,如果输入了非法unicode字符则panic
    let args : Vec<string> = env::args().collect();
    // 如果要接收非法Unicode字符,需要使用env::args_os(), 这个返回的是OsString
    println!("{:?}", args);
    let query = &args[1];
    let filename = &args[2];
    println!("{}, {}", query, filename);
    // read_to_string返回的是Result结果,如果是OK,则返回读取内容,如果失败则调用expect方法
    let contents = fs::read_to_string(filename).expect("read file faild");
    println!("read file txt:{}", contents);
}

按功能重构代码

二进制程序关注点分离指导原则:

  • 将程序拆分为main.rs和lib.rs,将业务逻辑放入lib.rs
  • 当命令行解析逻辑较少时,将它放在main.rs也可
  • 当命令行解析逐渐复杂,需提取到lib.rs
use std::env;
use std::fs; // 处理与文件相关的事务

fn main() {
    // args返回一迭代器,collect将迭代器转换为Vector,需指明类型
    // args函数无法处理非法Unicode字符,如果输入了非法unicode字符则panic
    let args : Vec<string> = env::args().collect();
    // 如果要接收非法Unicode字符,需要使用env::args_os(), 这个返回的是OsString
    println!("{:?}", args);
    let (query, filename) = parse_args(&args);
    println!("{}, {}", query, filename);
    // read_to_string返回的是Result结果,如果是OK,则返回读取内容,如果失败则调用expect方法
    let contents = fs::read_to_string(filename).expect("read file faild");
    println!("read file txt:{}", contents);
}

/**
 * @args: Vec切片,String类型元素
 * Return: 元组类型,数据是两个字符串切片,分别是查询关键字和文件名
 */
fn parse_args(args: &[String]) -> (&str, &str) {
    let query = &args[1];
    let filename = &args[2];
    (query, filename)
}

返回值的元组的内容,实际是相关联的,可建立一个结构体。

use std::env;
use std::fs; // 处理与文件相关的事务

fn main() {
    // args返回一迭代器,collect将迭代器转换为Vector,需指明类型
    // args函数无法处理非法Unicode字符,如果输入了非法unicode字符则panic
    let args : Vec<string> = env::args().collect();
    // 如果要接收非法Unicode字符,需要使用env::args_os(), 这个返回的是OsString
    let cfg = parse_config(&args);
    println!("{}, {}", cfg.query, cfg.filename);
    // read_to_string返回的是Result结果,如果是OK,则返回读取内容,如果失败则调用expect方法
    let contents = fs::read_to_string(cfg.filename).expect("read file faild");
    println!("read file txt:{}", contents);
}

struct Config {
    query: String,
    filename: String,
}

/**
 * @args: Vec切片,String类型元素
 * Return: Config实例,携带待查关键字和文件名信息
 */
fn parse_config(args: &[String]) -> Config {
    let query = args[1].clone();
    let filename = &args[2].clone();
    Config { query, filename }
}

而parse_config是构造一个Config实例,所以可实现成new函数(main.rs):

use std::env;
use std::fs; // 处理与文件相关的事务

fn main() {
    // args返回一迭代器,collect将迭代器转换为Vector,需指明类型
    // args函数无法处理非法Unicode字符,如果输入了非法unicode字符则panic
    let args : Vec<string> = env::args().collect();
    // 如果要接收非法Unicode字符,需要使用env::args_os(), 这个返回的是OsString
    println!("{:?}", args);
    let cfg = Config::new(&args);
    println!("{}, {}", cfg.query, cfg.filename);
    // read_to_string返回的是Result结果,如果是OK,则返回读取内容,如果失败则调用expect方法
    let contents = fs::read_to_string(cfg.filename).expect("read file faild");
    println!("read file txt:{}", contents);
}

struct Config {
    query: String,
    filename: String,
}

impl Config {
    /**
     * @args: Vec切片,String类型元素
     * Return: Config实例,携带待查关键字和文件名信息
     */
    fn new(args: &[String]) -> Config {
        let query = args[1].clone();
        let filename = &args[2].clone();
        Config { query, filename }
    }
}

标签:练习,23,read,args,filename,let,env,query,rust
From: https://www.cnblogs.com/UFO-blogs/p/17806280.html

相关文章

  • Javascript中表达式 "2"+3+4 的值为 "234"
    是左关联,表达式相当于("2"+3)+4根据ES5规范11,6,1节,如果某个操作数是字符串或者能够通过以下步骤转换为字符串的话,+将进行拼接操作。数字+字符串=>(数字).toString()+字符串如:1+'2'=12数字-字符串=>数字-Number(字符串)如:1-'2'=-1+是左连接......
  • THUSC2023游寄
    Day0中午在学校吃好饭,然和流到德清坐高铁到南京。\(15:00\)左右到的,领了一车纪念品。然后去听了下徐先友说说\(\text{Day1}\)和\(\text{Day2}\)的比赛详情,大概是\(\text{Day1}\)是省选\(\text{Day2}\)难度的正常\(\text{OI}\)比赛,三题拿\(130\)左右可以签一本;\(\t......
  • CSP-S2023游寄
    省流:寄飞了。初赛没什么好说的,所以说不写了/cf你说得对,但是我完善程序最后一题扣的分跟前面总共扣的分差不多。最终分数\(72\),本来感觉挺危的,但是浙江\(1700+\)的机位/bx复赛准考证号ZJ-S00191,杭师大仓前202C,欢迎找我面基/se突然发现我的准考证是去年我提高组的分数。......
  • [Rust] 对整形溢出的处理
    1.两种不同模式下的整形溢出坑了个爹的,书上说的没理解清楚,在Rust程序语言设计中文版3.2中提到了,当使用--release参数进行发布模式构建时,Rust不会检测导致panic的整形溢出,这里需要分两种情况考虑:编译期就可以发现的整形溢出程序运行过程中会发生的整形溢出1.1编译阶段如果......
  • 百度之星2023游寄
    初赛\(9.23\)在最后一场初赛前xy叫我们报名,每绷住。\(9.24\)下午\(14:00\)开打,开赛前机房里四个人在大声密谋如何作弊。\(14:00\)先开A,感觉萌萌题,先写。\(14:05\)写完了,但是过不了样例/fn,看了眼榜,发现都去做E了,跟榜。\(14:10\)E萌萌题,过了。\(14:30\)调出A......
  • 2023-2024-1 20231304 《计算机基础与程序设计》第六周学习总结
    2023-2024-120231304《计算机基础与程序设计》第六周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第六周作业这个作业的目标作业正文2023-2024-120231304《计算机基础与程......
  • 【专题】2023年中国手术机器人行业专题报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34144原文出处:拓端数据部落公众号仿生机器人作为一类结合了仿生学原理的机器人,具备自主决策和规划行动的能力,正逐渐进入大众视野。它们的核心技术要素包括感知与认知技术、运动与控制技术、人机交互技术和自主决策技术。阅读原文,获取专题报告合集......
  • 2023-2024-1 20231319 《计算机基础与程序设计》第六周学习总结
    2023-2024-120231319邓传山《计算机基础与程序设计》第四周学习总结作业信息这个作业属于哪个课程[2023-2024-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/12999)这个作业要求在哪里[作业要求](https://www.cnblo......
  • 2023/11/5 <div>标签的介绍
    <div>标签是用来为HTML文档的内容提供结构和背景的元素。<div>开始标签和</div>结束标签之间的所有内容都是用来构成这个快的,其中所包含标签的特性由<div>标签中的属性来控制,或者通过使用样式表格式化这个表来进行控制。 div全称division,意为分割.<div>标签被称为分割标签,表示......
  • test20231103
    T1还算是一道简单题,通过二分可以轻松求解。(但是我因为没有判断左端点挂了\(10pts\),不然我就是本场比赛的\(rk1\)了)虽然题解上说单调性是错误的,但是而二分能过,那就二分水过去吧。intn,k;inta[2050];boolvis[2050];inlineintwork(intx){memset(vis,0,sizeof......