我试图在服务启动时从系统环境加载密码和敏感数据.我try 了很多不同的方法,但似乎找不到正确的方法来解决这个问题.

const PASSWORD: String = var("PASSWORD").unwrap();

不起作用,因为method calls in constants are limited to constant inherent methods.同样的情况也适用于static(显然,除了表示statics的错误).

我见过的另一种方法是

const PASSWORD: &'static str = env!("PASSWORD");

但问题是,它将在编译时定义为env!是一个宏(至少我的理解是这样).

我还考虑过简单地将调用包装到函数中的var("...").unwrap(),但这种解决方案并不适合我,而且还允许在整个运行时更改值,而不是在服务启动时验证它们.

正如你所知,我是个新手.如果您能在回答中不仅解释如何在运行时加载const/static,而且还解释为什么我所做的是愚蠢和错误的,我将不胜感激:)

推荐答案

conststatic在Rust中扮演不同的角色.

const不仅意味着一个常数,它还意味着一个compile-time常数,一个在编译时确定并记录在程序只读存储器中的值.它不适合您的用例.

static表示一个全局变量,其生存期将跨越整个程序.它可能是可变的,在这种情况下,它必须是Sync以避免并发修改.static变量必须从一个常量初始化,以便从程序开始时可用.

那么,如何在运行时读取变量并使其可用?好吧,一个干净的解决方案是完全避免全球性的...

... 但既然方便,就有一个 crate :lazy_static!.

use std::env::var;
use lazy_static::lazy_static;

lazy_static! {
    static ref PASSWORD: String = var("PASSWORD").unwrap();
}

fn main() {
    println!("{:?}", *PASSWORD);
}

在第一次访问变量时,将执行表达式以加载其值,然后将该值存储并可用,直到程序结束.

Rust相关问答推荐

移植带有可变borrow 的C代码-卸载期间错误(nappgui示例)

如何在tauri—leptos应用程序中监听后端值的变化?""

为什么BitVec缺少Serialize trait?

关于如何初始化弱 struct 字段的语法问题

如何修复数组中NewType导致的运行时开销

在文件链实施中绕过borrow 判断器

Rust函数的返回值不能引用局部变量或临时变量

循环访问枚举中的不同集合

应为关联类型,找到类型参数

Rust从关联函数启动线程

由于生存期原因,返回引用的闭包未编译

如何将生存期参数添加到框<>;具有dyn类型别名

Const 上下文:从 init 函数创建具有 const 通用长度的数组

如何返回 struct 体中向量的切片

tokio::sync::broadcast::Receiver 不是克隆

如何将 C++ 程序链接到 Rust 程序,然后将该 Rust 程序链接回 C++ 程序? (cpp -> rust -> cpp)

&self 参数在 trait 的功能中是必需的吗?

返回迭代器的特征

为什么可以在迭代器引用上调用 into_iter?

`if let` 只是另一种编写其他 `if` 语句的方式吗?