我正在try 创建一个库,我想在其中包含一些二进制(或文本)文件,这些文件将包含在运行时解析的数据.

我的目的是控制这些文件,不断更新它们,并在每次更新中更改库的版本.

可以通过货运吗?如果是,我如何从我的库中访问这些文件?

我想到的一个解决办法是包含大约.rs个带有 struct 和/或常数(如&str)的文件,这些文件将存储数据,但我觉得这有点难看.

EDIT:

我已将已接受的答案更改为更适合我的情况的答案,不过请看Shepmaster's answer,因为这可能更适合您的情况.

推荐答案

Disclaimer: I mentioned it in a comment, but let me re-iterate here, as it gives me more space to elaborate.

正如Shepmaster所说,可以使用include_bytes!include_str!宏在Rust库/可执行文件中包含文本或二进制逐字记录.

然而,就你的情况而言,我会避免这样做.通过将内容解析推迟到运行时:

  • 你允许建造一个有缺陷的人工制品.
  • 您会产生(更多)运行时开销(解析时间).
  • 您会产生(更多)空间开销(解析代码).

Rust承认这一问题,并为代码生成提供了多种机制,旨在克服这些限制:

  • 宏:如果逻辑可以编码到宏中,那么它可以直接包含在源文件中
  • 插件:启动宏,可以对任意逻辑进行编码,并生成复杂的代码(见regex!)
  • build.rs:在编译之前运行的独立"Rust脚本",其作用是生成.rs个文件

在你的情况下,build.rs脚本听起来很合适:

  • 通过将解析代码移动到那里,可以提供更轻的工件
  • 通过提前解析,您可以提供更快的工件
  • 通过提前解析,您可以交付正确的工件

解析的结果可以用不同的方式编码,从函数到静态(可能是lazy_static!),因为build.rs可以生成任何有效的代码.

你可以看到如何使用build.rs/the Cargo Documentation;您将在那里找到如何将其与Cargo集成,以及如何创建文件(等等).

Rust相关问答推荐

如何在 struct 中填充缓冲区并同时显示它?

重新导出proc宏导致未解决的extern crate错误""

空字符串转换为Box字符串时是否分配?<>

如何容器化Linux上基于Rust的Windows应用程序的编译过程?

在Rust中,有没有一种方法让我定义两个 struct ,其中两个都遵循标准 struct ?

为什么BitVec缺少Serialize trait?

如何提高自定义迭代器的`extend`性能

在UdpSocket上使用sendto时的隐式套接字绑定

这是不是在不造成嵌套的情况下从枚举中取出想要的变体的惯用方法?

函数内模块的父作用域的访问类型

如何轮询 Pin>?

在 Rust 中,是否可以定义一个需要实现类型的构造函数的对象安全特征?

使用在功能标志后面导入的类型,即使未启用功能标志

从 Axum IntoResponse 获取请求标头

如何连接 Rust 中的相邻切片

从现有系列和 map 值创建新系列

为什么具有 Vec 变体的枚举没有内存开销?

如何异步记忆选项中的 struct 字段

深度嵌套枚举的清洁匹配臂

返回 &str 但不是 String 时,borrow 时间比预期长