当前位置: 首页 > news >正文

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语法的灵活性。

相关文章:

  • Allegro如何输出STP文件操作指导
  • Git 备忘单—你应该知道的 50 个 Git 命令
  • 多路转接(IO复用)接口介绍
  • MySQL JDBC编程
  • 计算机基础学习(好文必看)
  • Python冷知识:如何找出新版本增加或删除了哪些标准库?
  • JAVA初阶——继承和多态
  • python学习思路
  • MySQL纯代码复习(上)
  • 牛客刷题记录(常见笔试题)
  • 次元裂缝已打开,AI绘画突飞猛进,其潜力究竟有多大
  • 基于DJYOS的UART驱动编写指导手册
  • i++的错误使用
  • 这次把怎么做好一个PPT讲清-总体篇
  • web前端-第三次作业-按钮
  • 分享一个单片机GUI库,简洁,使用
  • 数据结构体进阶链表【带头双向循环链表,单向链表的优化,从根部解决了顺序表的缺点】一文带你深入理解链表
  • 【数据结构】栈和队列
  • 硬核Vue3响应式原理解析,为你保驾护航渡过寒冬
  • 轻松掌握 jQuery 基础