Rust引用转换时避免使用变量

本文较短,留待日后参考。

检测文件存在引发的问题

笔者在使用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/zsh
    Finished release [optimized] target(s) in 0.01s
     Running `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<OsStr> for OsString
fn as_ref(&self) -> &OsStr

impl AsRef<Path> 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::<Path>::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::<Path>::as_ref(&file)

随后立即调用其exists()方法,从而直接得到文件是否存在的布尔值,省略了filepath引用变量。尽管这是一个小的改进,但积累起来可以让开发者编写更加简洁高效的代码;此外,这一改进亦可见Rust语法的灵活性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值