rust - 如何避免 Rust 中的硬编码值

标签 rust rust-cargo

下面是一个Maven/Java目录结构。

- src
  - main
    - java
    - resources
  - test
    - java
    - resources

- target

这里,resources文件夹存放应用程序相关的配置文件和资源文件,以避免在源文件中硬编码它们的内容。

我如何在 Rust 中使用 Cargo 实现同样的效果?

最佳答案

Maven 不包含您源代码中的所有内容。事实上,它包含二进制文件,但甚至不必在 .jar 中包含源代码。您可以将其配置为说明要包含的内容,默认情况下是 resources 目录中的所有内容。

cargo 包源代码。 一切 都将包含在箱子中,除了与您的 .gitignore 文件匹配的东西。您可以在 Cargo.toml 文件中通过添加 include or exclude 对其进行微调。 [package] 部分中的条目。

要访问这些文件,有几个选项。

例如,如果您的项目如下所示:

- Cargo.toml
- src
   - main.rs
- resources
   - hello.txt

访问hello.txt主要有以下三种方式。

include!

使用 include! 宏,您可以像这样从 main.rs 访问 hello.txt:

let hello: &str = include!("../resources/hello.txt");

请注意,宏会直接将文件包含在源代码中,就像您复制并粘贴文件内容一样。所以我给出的示例只有在文件内容包含 "" 引号时才有效。任何 Rust 源代码都可以放在那里,并且必须在编译时包含它。这可以很方便地包含复杂的 Rust 结构,而无需编写解析代码。请注意,该路径是相对于包含它的源 .rs 文件而言的。

include_bytes!include_str!

include_bytes! 宏从文件创建一个固定大小的 u8 数组,在编译时包含。

let bytes = include_bytes!("../resources/hello.txt").
let hello: String = String::from_bytes_lossy(bytes).to_string();

这很方便将任意二进制数据合并到您的应用程序中,例如图像,而无需在运行时加载它。该数组具有 'static 生命周期,因此将在应用程序的整个生命周期内保留在内存中。

include_str! 宏的工作方式类似,但会产生一个字符串切片,同样具有 'static 生命周期。

在运行时

要在运行时加载文件,您可以使用:

let hello = std::fs::read_to_string("resources/hello.txt").unwrap();

这里的路径是相对于你的包的根目录的。这假设您正在从构建它的地方使用 cargo run 运行应用程序。如果您要部署二进制文件,您可能必须提供应用程序应在何处找到其资源的路径。

通常,这是首选方法。它更加灵活,因为您可以在运行时交换配置或使用应用程序参数从不同位置加载。有很多用于解析不同文件格式的箱子,包括 json , toml还有很多其他的。您可以控制所加载数据的生命周期,因此您可以确保在使用完数据后将其释放。

关于rust - 如何避免 Rust 中的硬编码值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46486134/

相关文章:

rust - 无法安装Racer : "pub(restricted) syntax is experimental (see issue #32409)"

rust - 在 Rust FFI 中混合静态库和动态库

rust - 如何从文件或 URL 创建 Rust Quick XML 阅读器?

rust - 你如何在 Rust 中导入和引用枚举类型?

rust - 从 channel 读取并使用 poll_fn 和 try_ready 的 Tokio future 永远不会完成

logging - 如何使用 log4rs 创建自定义过滤器类型?

rust - 用特征别名替换特征绑定(bind)说 "the size for values cannot be known at compilation time"

rust - 如何为 Cargo.toml 中的 [build-dependencies] 生成 rustdoc 文档?

unit-testing - 当两个字符串不相等时,assert_eq 宏是否可能显示差异?

macos - OpenSSL crate 在 Mac OS X 10.11 上编译失败