Rust语言教程 - 与环境交互

Posted Jtag特工

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rust语言教程 - 与环境交互相关的知识,希望对你有一定的参考价值。

Rust语言教程(5) - 与环境交互

学习了基本编程结构之后,我们还需要了解如何和外界环境打交道,这样才有能力做些有用的工具。

调用外部应用程序

通过标准库中的std::process::Command可以调用外部的应用程序或者命令。

我们来看个例子:

    let output = Command::new("ls")
        .arg("/Users/lusinga/working/llvm-project-11.0.0")
        .output();
    println!(":?",output.unwrap());

输出:

Output  status: ExitStatus(ExitStatus(0)), stdout: "CONTRIBUTING.md\\nREADME.md\\nclang\\nclang-tools-extra\\ncompiler-rt\\ndebuginfo-tests\\nflang\\nlibc\\nlibclc\\nlibcxx\\nlibcxxabi\\nlibunwind\\nlld\\nlldb\\nllvm\\nmlir\\nopenmp\\nparallel-libs\\npolly\\npstl\\nutils\\n", stderr: "" 

返回的标准输出值在output.stdout里,它是一个u8的Vec,可以拿来进行处理。

创建新线程

过不了多久,生活在原生多核时代的同学们就将走上工作岗位和我们一起编程了,所以这时候还有单任务确实说不过去了。
Rust的多任务支持说来话长,而且也还在迭代改进中,不过基本上大家熟悉的thread, future, async这些都有,用起来也不复杂。

首先最简单的还是创建一个新线程。 创建新线程使用thread::spawn方法,参数是一个闭包。这个闭包不需要参数。
我们来看个最简单的例子:

    let child1 = thread::spawn(|| 
        println!("Hello,from thread");
    );

调用线程之后我们可以给个返回值,比如我们改成这样:

    let child1 = thread::spawn(|| 
        println!("Hello, from new thread!");
        return "From thread";
    );

返回类型是一个JoinHandle<&str>类型,我们可以通过JoinHandle的join方法去读取:

    let str1 = child1.join().unwrap();
    println!("In main thread - :?",str1);

输出结果是这样的:

Hello, from new thread!
In main thread - "From thread"

最后,如果想引用外面的变量怎么办?这时候我们需要获取所有权了,所以我们需要将闭包改成move闭包,就是在闭包前面加上move来修饰:

fn test_thread()
    let str1 = "Hello, defined in main thread";
    let child1 = thread::spawn(move || 
        println!("",str1);
        return "From thread";
    );

    let str1 = child1.join().unwrap();
    println!("In main thread - :?",str1);

读取目录

跟进程打完交道之后,我们开始跟文件系统进行交互。这会使用到std库中fs模块的一些类型。

首先我们使用Path来描述一个路径:

    let path1 = Path::new("/Users/lusinga/working/llvm-project-11.0.0");
    println!(":?",path1.file_name().unwrap());

输出为:

"llvm-project-11.0.0"

然后我们可以用read_dir方法去读取目录下的内容:

    let dir_result = path1.read_dir().unwrap();

    for entry_result in  dir_result
        let entry  = entry_result.unwrap();
        println!(":?",entry.path());
    

read_dir返回的是ReadDir类型,它是一个Result的迭代器。我们使用for循环来遍历它,每个元素就是一个DirEntry。

读取标准输入

当我们学习C++的时候,在一开始就会学到cout和cin,做oj题目的时候,如果没有办法从标准输入读入,题都没法做。

我们可以通过std::io::stdin()来获取标准输入流,然后通过read_line方法来获取一行输入。

我们来看个例子:

    let mut str8 = String::with_capacity(255);
    let sin = std::io::stdin().read_line(&mut str8);
    println!("",str8);

read_line方法需要一个mut String的引用作为参数。

获取字符串之后,可以使用之前介绍的parse方法来转换。

我们来看个读取数字的例子:

    println!("Please input a number:");
    let mut str8 = String::with_capacity(255);
    let sin = std::io::stdin().read_line(&mut str8);
    let num8 = str8.trim().parse::<i32>().unwrap();
    println!("",num8);

小结

到目前为止,我们发现,即使对于Rust的很多核心不了解的情况下,我们仍然可以开始写很多代码了。毕竟Rust是工具而不是信仰,能够让更多同学将其用起来解决问题是第一要务。

以上是关于Rust语言教程 - 与环境交互的主要内容,如果未能解决你的问题,请参考以下文章

「Rust语言」最全的Rust初学者的完全免费资源

GPT4微软 GPT-4 测试报告与外界环境的交互能力

Rust语言教程 - 数组与向量

Rust语言教程 - 结构体与方法的结合

Rust语言教程 - if let表达式与枚举进阶

Rust语言教程 - if let表达式与枚举进阶