static - 在 Rust 中运行时使用环境变量填充静态/常量

标签 static environment-variables rust constants

我正在尝试在我的服务启动时从系统环境加载密码和敏感数据。我尝试了多种不同的方法,但似乎无法找到在 Rust 中执行此操作的正确方法。

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

不起作用,因为常量中的方法调用仅限于常量固有方法。这同样适用于 static(除了错误说静态,显然)。

我见过的另一种方法是

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

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

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

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

最佳答案

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

const 不仅表示一个常量,它还表示一个编译时常量,一个在编译时确定并刻在程序的只读存储器中的值程序。它不适合您的用例。

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

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

...但是因为它很方便,所以有一个箱子:lazy_static! .

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

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

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

在第一次访问变量时,执行表达式以加载它的值,然后该值被内存并可用,直到程序结束。

关于static - 在 Rust 中运行时使用环境变量填充静态/常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37405835/

相关文章:

java - 这段代码有竞争条件吗?

linux - 如何 - Linux 中的多个 Dropbox 实例?

python - 在 Windows 中为 Flask 应用程序导出环境变量

python - 使用 boto 将环境变量添加到 ec2 实例

rust - 如何改变 Iterator::find 的闭包中的项目?

ios - Xcode 9 : Linking a static framework against another static framework

c# - 为什么 System.Array 的大多数方法都是静态的?

php - MySQL 与静态 HTML 页面

unit-testing - 编写 Substrate Runtime Test 时快进时间

rust - 列出作用域中某个类型实现的所有特征