从命令行读取参数

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!

4.2 rust 命令行参数的更多相关文章

  1. python处理命令行参数

    直接从命令行执行py文件的时候如果带有参数,如何获取这些参数,如何解析? http://blog.chinaunix.net/uid-20786165-id-3182268.html sys.argv ...

  2. .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]

    较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...

  3. Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数

    特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2. $# 传递给脚本或函数的参数个数. $* 传 ...

  4. powershell脚本,命令行参数传值,并绑定变量的例子

    这是小技巧文章,所以文章不长.但原创唯一,非常重要.我搜了下,还真没有人发 powershell怎样 [命令行 参数 绑定],所以我决定写成博客. 搜索关键字如下: powershell 命令行 参数 ...

  5. VS2013 带命令行参数的调试问题 解决方案

    int main(int argc,char* argv[]) argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数 比如:  ...

  6. 使用getopt()处理命令行参数

    假设有一程序 testopt,其命令行选项参数有: -i            选项 -l            选项 -r           选项 -n <值> 带关联值的选项 则处理 ...

  7. 7z命令行参数中的路径

    最近在自动化的过程中用到了7z命令行工具,发现其参数中的路径挺有意思的,在此总结一下.本文中所有demo使用的7z版本为:15.14 x64. 压缩某个文件夹 下面的命令会把g:\temp\目录和目录 ...

  8. [转]Python 命令行参数和getopt模块详解

    FROM : http://www.tuicool.com/articles/jaqQvq 有时候我们需要写一些脚本处理一些任务,这时候往往需要提供一些命令行参数,根据不同参数进行不同的处理,在Pyt ...

  9. 你可能不知道的Google Chrome命令行参数

    概述:              关于Google Chrome命令行参数(英文叫Google Chrome Command line switches),是Chrome为了实现实验性功能.方便调试. ...

随机推荐

  1. 如何抓取直播源及视频URL地址-疯狂URL(教程)

    直播源介绍 首先,我们来快速了解一下什么是直播源,所谓的直播源,其实就说推流地址,推流地址可能你也不知道是什么,那么我再简单说一下,推流地址就是,当某个直播开播的时候,需要将自己的直播状态实时的展示给 ...

  2. Linux的inode与block

    1,inode包含文件的元信息,具体来说有以下内容: 文件的字节数 文件拥有者的User ID 文件的Group ID 文件的读.写.执行权限 文件的时间戳,共有三个:ctime指inode上次文件属 ...

  3. centos7 永久修改hostname

    1.修改 /etc/sysconfig/network ,重启后还是原来的主机名 2.百度有说明是/etc/rc.d/rc.sysinit下的脚本还原了还来主机名,问题是的我主机上没有这个脚本 3.执 ...

  4. 登录、注销&用户和用户组管理

    登录.注销 # 立刻关机 shutdown -h now # 1分钟后,关机 shutdown -h 1 # 立刻重启 shutdown -r now # 2分钟后,重启 shutdown -r 2 ...

  5. PTA 7-7 六度空间 (30分)

    PTA 7-7 六度空间 (30分) "六度空间"理论又称作"六度分隔(Six Degrees of Separation)"理论.这个理论可以通俗地阐述为:& ...

  6. PTA 7-2 邻接表创建无向图 (20分)

    PTA 7-2 邻接表创建无向图 (20分) 采用邻接表创建无向图G ,依次输出各顶点的度. 输入格式: 输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶点数和边数. 输 ...

  7. 菜鸡的Java笔记 第十七 static 关键字

    static 是java中定义的一个关键字,主要是描述全局的概念,所以利用static关键字可以定义属性,定义方法        但是在90%的情况下,我们的开发代码很少会去直接编写static*// ...

  8. [bzoj2400]Optimal Marks

    首先肯定每一位单独考虑,对于每一位,源点连向该位点权为0的节点inf的边,点权为1的节点连向汇点inf的边,每一条无向边拆成两条流量为1的有向边,跑最小割. 考虑一组割,一定将原图划分成源点和汇点两部 ...

  9. 一文带你吃透CLR垃圾回收机制

    前言 今天我们来共同学习一下CLR的垃圾回收机制,这对我们写出健壮性的代码很有帮助,也许有人会认为多此一举,认为垃圾回收交给CLR就行,我不用关心这个,诚然,大多数情况下是这样的,但是,我们今天讨论的 ...

  10. 「后端小伙伴来学前端了」Vuex进阶操作,让你的代码更加高效(简称如何学会偷懒 【手动狗头】)

    学妹手机里的美照 前言 前一篇写了Vuex基本使用,用起来还稍稍有些繁琐,代码有很多 冗余的地方,这篇就带着大家用更简单的方式来使用Vuex(其实就是怎么更好的偷懒,用更少的代码来完之前的事情) 进入 ...