gpt4 book ai didi

rust - 如何使用包含宏从单个文件加载多个元素?

转载 作者:行者123 更新时间:2023-11-29 08:31:32 25 4
gpt4 key购买 nike

macro_rules! vec_strs {
(
$($element:expr),*
) => {
{
let mut v = Vec::new();
$(
v.push(format!("{}", $element));
)*
v
}
};
}

fn main() {
let v = vec_strs!("1", "2");
println!("{}", v);
}

问题是我的字符串放在一个文件中:

文件.in:

"first", "second", "third", .... 

我无法更改文件的内容。我如何使用 include!/include_str! 和我的宏 vec_strs 将元素“加载”到 file.in< 中的向量?提前致谢。

最佳答案

对此没有一步到位的解决方案。 include! 宏假定它将从文件加载完整格式的 Rust 语法,而您的文件不是那个。

最接近的是 build script .有了它,您可以解析任何类型的输入并生成任何类型的输出。

因为你的代码几乎是一个文字数组,你能做的最便宜的事情就是在它周围添加方括号:

build.rs

use std::{
env,
fs::File,
io::{self, Write},
path::PathBuf,
};

fn main() -> Result<(), Box<std::error::Error>> {
let mut src = File::open("file.in")?;

let out_dir: PathBuf = env::var_os("OUT_DIR").ok_or("Cannot find OUT_DIR")?.into();
let out_file = out_dir.join("file.in.rs");
let mut out = File::create(out_file)?;

write!(&mut out, "[")?;
io::copy(&mut src, &mut out)?;
write!(&mut out, "]")?;

Ok(())
}

然后您可以直接导入该数组:

const STRINGS: &[&str] = &include!(concat!(env!("OUT_DIR"), "/file.in.rs"));

fn main() {
for s in STRINGS {
println!("{}", s);
}
}

当然,您可以更改构建脚本以满足您的需要。例如,您可以生成对宏的调用,然后导入包含宏调用的文件。

另见:


作为奖励,您的宏应该被编写为利用 vec!,它使用一些编译器内部机制来提高效率:

macro_rules! vec_strs {
($($element:expr),*) => {
vec![$($element.to_string()),*]
};
}

关于rust - 如何使用包含宏从单个文件加载多个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56583209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com