从命令行读取参数

use std::env;

fn main() {
let args: Vec<String> = env::args().collect();
println!("{:?}", args);
}
ai@aisty:/opt/wks/rust/rfil/rcmd/target/debug$ ./rcmd aa bb cc
["./rcmd", "aa", "bb", "cc"]

第一个参数是命令本身

The args Function and Invalid Unicode

Note that std::env::args will panic if any argument contains invalid Unicode. If your program needs to accept arguments containing invalid Unicode, use std::env::args_os instead. That function returns an iterator that produces OsString values instead of String values. We’ve chosen to use std::env::args here for simplicity, because OsString values differ per platform and are more complex to work with than String values.

索引为0的参数是命令本身,从索引为1的参数开始才是输入的参数

use std::env;

fn main() {
let args: Vec<String> = env::args().collect(); let query = &args[1];
let filename = &args[2]; println!("Searching for {}", query);
println!("In file {}", filename);
}
ai@aisty:/opt/wks/rust/rfil/rcmd$ cargo run name /tmp/aa.txt
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
Running `target/debug/rcmd name /tmp/aa.txt`
Searching for name
In file /tmp/aa.txt

读取指定的文件内容

use std::env;
use std::fs; fn main() {
let args: Vec<String> = env::args().collect(); let filename = &args[1];
println!("In file {}", filename); let contents = fs::read_to_string(filename)
.expect("Something went wrong reading the file"); println!("With text:\n{}", contents); }
ai@aisty:/opt/wks/rust/rfil/rcmd$ cargo run /tmp/aa.txt
Compiling rcmd v0.1.0 (/opt/wks/rust/rfil/rcmd)
Finished dev [unoptimized + debuginfo] target(s) in 0.21s
Running `target/debug/rcmd /tmp/aa.txt`
In file /tmp/aa.txt
With text:
aa
use std::env;
use std::fs; fn main() {
let args: Vec<String> = env::args().collect(); let (query, filename) = parse_config(&args); // --snip-- println!("Searching for {}", query);
println!("In file {}", filename); let contents = fs::read_to_string(filename)
.expect("Something went wrong reading the file"); println!("With text:\n{}", contents);
} fn parse_config(args: &[String]) -> (&str, &str) {
let query = &args[1];
let filename = &args[2]; (query, filename)
}
ai@aisty:/opt/wks/rust/rfil/rcmd$ cargo run aa /tmp/aa.log
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
Running `target/debug/rcmd aa /tmp/aa.log`
Searching for aa
In file /tmp/aa.log
With text:
aa
bb
use std::env;
use std::fs; fn main() {
let args: Vec<String> = env::args().collect(); let config = parse_config(&args); println!("Searching for {}", config.query);
println!("In file {}", config.filename); let contents = fs::read_to_string(config.filename)
.expect("Something went wrong reading the file"); println!("With text:\n{}", contents);
} struct Config {
query: String,
filename: String,
} fn parse_config(args: &[String]) -> Config {
let query = args[1].clone();
let filename = args[2].clone(); Config { query, filename }
}

clone性能不好,后面会介绍其他方式

There’s a tendency among many Rustaceans to avoid using clone to fix ownership problems because of its runtime cost.

use std::env;
use std::fs; fn main() {
let args: Vec<String> = env::args().collect(); let config = Config::new(&args); println!("Searching for {}", config.query);
println!("In file {}", config.filename); let contents = fs::read_to_string(config.filename)
.expect("Something went wrong reading the file"); println!("With text:\n{}", contents); } struct Config {
query: String,
filename: String,
} impl Config {
fn new(args: &[String]) -> Config {
let query = args[1].clone();
let filename = args[2].clone(); Config { query, filename }
}
}

添加自定义错误

use std::env;
use std::fs; fn main() {
let args: Vec<String> = env::args().collect(); let config = Config::new(&args); println!("Searching for {}", config.query);
println!("In file {}", config.filename); let contents = fs::read_to_string(config.filename)
.expect("Something went wrong reading the file"); println!("With text:\n{}", contents); } struct Config {
query: String,
filename: String,
} impl Config {
fn new(args: &[String]) -> Config {
if args.len() < 3 {
panic!("not enough arguments");
} let query = args[1].clone();
let filename = args[2].clone(); Config { query, filename }
}
}

Returning a Result from new Instead of Calling panic!

最新文章

  1. Nacl开发
  2. 【集合框架】JDK1.8源码分析之LinkedHashMap(二)
  3. robots.txt文件没错,为何总提示封禁
  4. 通过SSIS监控远程服务器Windows服务并发送邮件报警!
  5. Hash哈希(二)一致性Hash(C++实现)
  6. Android之Fragment(二)
  7. VS 2010 WebSite网站 使用CodeBehide 方式开发[Web应用程序项目转Web网站]
  8. 获取contenteditable的内容 对html进行处理 兼容 chrome、IE、Firefox
  9. html5视频小站
  10. springmvc配置aop
  11. iOS开发——自定义进度圆环
  12. 基于ES6模块标准通过webpack打包HTM5项目
  13. windows环境下,anoconnda安装tensorflow
  14. bzoj 4873: [Shoi2017]寿司餐厅 [最小割]
  15. 通过WMI获取机器信息
  16. Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to ;XX.XX.XX.XX:6379] with root cause
  17. Maven之setting.xml配置文件详解
  18. [CodeForces - 197B] B - Limit
  19. 杂谈---这些大忌,你在面试的时候发生过吗?(NO.1)
  20. synchronized修饰方法和对象的区别

热门文章

  1. Zabbix webhook 自定义报警媒介
  2. idea如何在终端使用git并解决终端中文乱码
  3. uni-app map组件关于marker标记点动态设置的问题
  4. 南大《软件分析》课程笔记——Intermediate Representation
  5. 一个校验接口引发的思考--我真的了解Response吗
  6. blazor wasm开发chrome插件
  7. Databend 设计概述 | 白皮书
  8. Python爬虫中的URLError\HTTPError异常类,异常的抛出
  9. 《手把手教你》系列技巧篇(四十四)-java+ selenium自动化测试-处理https 安全问题或者非信任站点-下篇(详解教程)
  10. [luogu7740]机器人游戏