我正在尝试创建一个库,并且我想在其中包含一些二进制(或文本)文件,这些文件将包含将在运行时解析的数据。
我的目的是控制这些文件,不断更新它们并在每次更新中更改库的版本。
这可以通过货物吗?如果是这样,我如何从我的库中访问这些文件?
我想到的一个解决方法是包含一些.rs
带有结构和/或常量的文件,例如&str
它们将存储数据,但我觉得它有点难看。
编辑:
我已将接受的答案更改为更适合我的情况的答案,但是请查看Shepmaster 的答案,因为这可能更适合您的情况。
我正在尝试创建一个库,并且我想在其中包含一些二进制(或文本)文件,这些文件将包含将在运行时解析的数据。
我的目的是控制这些文件,不断更新它们并在每次更新中更改库的版本。
这可以通过货物吗?如果是这样,我如何从我的库中访问这些文件?
我想到的一个解决方法是包含一些.rs
带有结构和/或常量的文件,例如&str
它们将存储数据,但我觉得它有点难看。
编辑:
我已将接受的答案更改为更适合我的情况的答案,但是请查看Shepmaster 的答案,因为这可能更适合您的情况。
免责声明:我在评论中提到了它,但让我在这里重申一下,因为它给了我更多的空间来阐述。
正如 Shepmaster 所说,可以使用include_bytes!
和include_str!
宏将文本或二进制逐字包含在 Rust 库/可执行文件中。
但是,在你的情况下,我会避免它。通过将内容的解析推迟到运行时:
Rust 承认了这个问题,并提供了多种代码生成机制来克服这些限制:
regex!
)build.rs
:在编译之前运行的独立“Rust 脚本”,其作用是生成.rs
文件在您的情况下,build.rs
脚本听起来很合适:
解析的结果可以用不同的方式编码,从函数到静态(可能lazy_static!
),build.rs
可以生成任何有效的 Rust 代码。
build.rs
您可以在Cargo Documentation中查看如何使用;您会在那里找到如何将其与 Cargo 集成以及如何创建文件(等等)。
include_bytes!
宏似乎接近你想要的。它只给你一个字节数组的引用,所以你必须从那开始做任何解析:
static HOST_FILE: &'static [u8] = include_bytes!("/etc/hosts");
fn main() {
let host_str = std::str::from_utf8(HOST_FILE).unwrap();
println!("Hosts are:\n{}", &host_str[..42]);
}
如果您有 UTF-8 内容,则可以使用Benjamin Lindleyinclude_str!
指出的:
static HOST_FILE: &'static str = include_str!("/etc/hosts");
fn main() {
println!("Hosts are:\n{}", &HOST_FILE[..42]);
}