从命令行读取参数

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. 使用NLog把日志写入数据库并按天自动分表

    前言 最近用Asp.net Core开发程序的时候 因为时间的关系,就没有过多的去关注日志方面的功能 都是直接用系统的ILogger先记录着,然后看日志的时候就先在命令行看日志 在开发阶段没有什么问题 ...

  2. 动手个性化设置自己的 IntelliJ IDEA

    前言 IDEA 是一个智能开发工具,每个开发者的使用习惯不同,如何个性化自己的IDEA? 我们可以通过 Settings 功能来设置. Settings文件是 IDEA 的配置文件,通过它可以设置主题 ...

  3. github上传和删除文件(三)

    上传文件: git init git add * git commit -m "description" //git remote rm origin 或查看当前 git remo ...

  4. 服务端渲染技术NUXT

    什么是服务端渲染 ​ 服务端渲染又称SSR (Server Side Render),是在服务端完成页面的内容,而不是在客户端通过AJAX获取数据. 服务器端渲染(SSR)的优势主要在于:更好的 SE ...

  5. Apache Hudi在华米科技的应用-湖仓一体化改造

    徐昱 Apache Hudi Contributor:华米高级大数据开发工程师 巨东东 华米大数据开发工程师 1. 应用背景及痛点介绍 华米科技是一家基于云的健康服务提供商,拥有全球领先的智能可穿戴技 ...

  6. Spring Cloud Gateway的断路器(CircuitBreaker)功能

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. [atARC086F]Shift and Decrement

    将$A$操作看作直接除以2(保留小数),最终再将$a_{i}$取整 记$k$表示$A$操作的次数,$p_{i}$表示第$i$次$A$和第$i+1$次$A$之间$B$操作的次数(特别的,$p_{0}$为 ...

  8. vue3 + vite实现异步组件和路由懒加载

    在 Vue2 中,异步组件和路由懒加载处理使用 import 就可以很轻松实现.但是在Vue 3.x 中异步组件的使用与 Vue 2.x 完全不同了.本文就详细讲讲vue3中异步组件和路由懒加载的实现 ...

  9. 【玩具】使用Python自动化发送微信消息进行订水

    事情是这样的,我知道淘宝上有卖一种USB接口的大按钮,估计是给工厂或者医院之类的场景设计的,样子长这样: 然后我就一直挺想搞一个的,不为别的,就是玩,但是想来想去也没想到这玩意儿对我而言能有啥用途,就 ...

  10. [TopCoder2014Final]FrozenStandings 解法探究

    https://vjudge.net/problem/TopCoder-13460 简要题意:给出 \(n\) 段从 \(1\) 到 \(n\) 编号的等长区间,保证区间的端点互不相同.区间可以选取其 ...