什么是用于连接任意数量的组件以在 Rust 中构建路径的宏?

kon*_*tin 9 macros path filepath rust

在 Python 中,一个名为的函数os.path.join()允许使用操作系统的路径分隔符将多个字符串连接到一个路径中。在 Rust 中,只有一个join()将字符串或路径附加到现有路径的函数。这个问题不能用普通函数解决,因为普通函数需要有固定数量的参数。

我正在寻找一个宏,它接受任意数量的字符串和路径并返回连接的路径。

Cod*_*key 7

文档中PathBuf有一个相当简单的例子:

use std::path::PathBuf;
let path: PathBuf = [r"C:\", "windows", "system32.dll"].iter().collect();
Run Code Online (Sandbox Code Playgroud)

  • @PaulRazvanBerg 它使其成为[原始字符串文字](https://rahul-thakoor.github.io/rust-raw-string-literals/)。正如您所说,这使得您无需编写两个斜杠“\\”即可获得单个斜杠。 (3认同)

She*_*ter 5

一旦你阅读了宏语法,这还不算太糟糕。基本上,我们需要至少两个参数,第一个需要可转换为PathBufvia Into。每个后续参数都push在末尾 ed ,它接受任何可以变成对 a 的引用的东西Path

macro_rules! build_from_paths {
    ($base:expr, $($segment:expr),+) => {{
        let mut base: ::std::path::PathBuf = $base.into();
        $(
            base.push($segment);
        )*
        base
    }}
}

fn main() {
    use std::{
        ffi::OsStr,
        path::{Path, PathBuf},
    };

    let a = build_from_paths!("a", "b", "c");
    println!("{:?}", a);

    let b = build_from_paths!(PathBuf::from("z"), OsStr::new("x"), Path::new("y"));
    println!("{:?}", b);
}
Run Code Online (Sandbox Code Playgroud)