本文较短,留待日后参考。
笔者在使用Rust编写某特定功能时,需要通过命令行转入的参数检测某文件是否存在;为方便说明问题,笔者编写的代码精简如下:
use std::path::Path;fn main() {let args = std::env::args_os().skip(1);for file in args {let filepath: &Path = file.as_ref();let exist = filepath.exists();let filestr = file.as_os_str().to_string_lossy();println!("File '{}' exists: {}", filestr, exist);// if exist {// process_file(&filestr);// }}
}
编译后执行的结果如下:
$ cargo run --release /usr/bin/bash /usr/bin/zshFinished release [optimized] target(s) in 0.01sRunning `target/release/file-check /usr/bin/bash /usr/bin/zsh`
File '/usr/bin/bash' exists: true
File '/usr/bin/zsh' exists: false
笔者的诸求比较简单,因filepath
引用变量的类型为&Path
,且仅使用到一次(调用了其exists方法),笔者希望代码更为简洁,省去这一转换的引用变量;换句话说,删除仅用一次的filepath
引用变量。
以上代码中,for
循环遍历迭代变量args
得到的file
类型为OsString,该类型有两种引用转换:
impl AsRef for OsString
fn as_ref(&self) -> &OsStrimpl AsRef for OsString
fn as_ref(&self) -> &Path
这两种转换分别可以得到&OsStr
和&Path
两种类型的引用。为了避免引入仅用一次的filepath
,笔者修改后的代码如下:
use std::path::Path;fn main() {let args = std::env::args_os().skip(1);for file in args {let exist = AsRef::::as_ref(&file).exists();let filestr = file.as_os_str().to_string_lossy();println!("File '{}' exists: {}", filestr, exist);// if exist {// process_file(&filestr);// }}
}
代码用,笔者用到了显示指定引用转变类型的方法得到了一个&Path
的引用:
AsRef::::as_ref(&file)
随后立即调用其exists()
方法,从而直接得到文件是否存在的布尔值,省略了filepath
引用变量。尽管这是一个小的改进,但积累起来可以让开发者编写更加简洁高效的代码;此外,这一改进亦可见Rust
语法的灵活性。