问题标签 [lazy-static]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
150 浏览

rust - 从 std::env::consts::OS=="windows" 在 Rust 中定义一个静态布尔值

我想创建一个IS_WINDOWS在 Rust 文件中调用的全局静态布尔值:

但是,当我这样做时,任何IS_WINDOWS从其他地方引用该值的东西都不会将其视为 a bool,而是将其视为自定义IS_WINDOWS结构,即尝试执行以下操作:

...导致错误:

0 投票
0 回答
104 浏览

multithreading - 访问全局 HashMap 中不相交的条目以获取 Rust 中线程的生命周期

我当前的项目需要记录线程执行期间发生的各种事件的一些信息。这些事件由线程 id 保存在全局结构索引中:

每个线程都将 new 附加Entry到其向量中。因此,线程访问“不相交”的向量。Rust 需要同步原语来完成上述工作。所以真正的实现看起来像:

这可行,但所有线程都在同一个全局锁上竞争。如果一个线程可以在线程的生命周期内“借用”其各自的向量,那就太好了,这样它就可以写入它需要的所有条目,而无需每次都锁定(我知道外部锁定对于确保线程不插入是必要的同时进入 HashMap)。

为此,我们可以通过 Mutex 为 HashMap 中的值添加 Arc 和更多内部可变性:

现在我们可以在产生线程时“检查”我们的条目:

这有效,这就是我想要的。但是,由于 API 限制,我必须从代​​码中不同的地方访问 MutexGuard,而无法将 MutexGuard 作为参数传递给函数。因此,我使用线程局部变量:

我做不到,LOCAL_ENTRIES: MutexGuard<_>因为thread_local!需要'static一生。所以目前我.lock()每次想访问线程局部变量时都必须:

很抱歉所有的代码和解释,但我真的被困住了,想说明为什么它不起作用以及我想要做什么。如何在 Rust 中解决这个问题?

还是我被互斥锁的成本挂断了?对于 any Arc<Mutex<Vec<Entry>>>,锁将始终被解锁,因此进行原子锁定的成本会很小?

感谢您的任何想法。这是Rust Playground中的完整示例。

0 投票
1 回答
228 浏览

rust - 我应该使用什么类型来返回lazy_static 值?

我计划有一个通过 trait 方法提供 JSON 模式的结构。模式存储在一个惰性静态变量中,但我的schema()函数必须返回哪种类型?

我会收到这个错误

0 投票
0 回答
40 浏览

multithreading - Rust:为什么lazy_static 不适用于某些类型

我需要创建一些全局可变变量,使用lazy_static!某些类型有效,但某些其他类型无效。互斥锁是用来改变值的。

这有效:

这不是(Function即 js_sys::Function)

错误是:*mut u8 is not safe to send between threads

我目前的解决方法是使用 thread_local!对于全局可变变量,但我需要线程。如何lazy_static与所有类型一起使用?

0 投票
1 回答
137 浏览

rust - 从 Rust 中的全局 HashMap 获取项目的引用

我正在尝试使用静态 HashMap<String, Object> 来存储一些我想在未来全局使用和修改的数据。我发现声明这种全局映射的某种方式是使用lazy_static 和互斥锁,以便安全地共享数据。但是,当我想将这些对象作为参考返回时,我遇到了一些所有权问题,就像我在上面的代码中所做的那样:

所以问题是:有没有办法正确地做到这一点?Rust 中是否存在我可以用来实现这种行为的任何设计模式?

非常感谢!

0 投票
1 回答
226 浏览

rust - 从 Rust 中的不同模块填充静态数组?

在我的 Rust 项目中,我需要一个全局保持、静态数组或 vec,它在模块可以注册值或函数的地方初始化一次。我想,使用lazy_static!-crate 可以做到这一点,但似乎并非如此。

这就是我想要实现的目标:

  • 模块a用一些数据初始化一个数组/向量。
  • 然后模块b(或更多模块)将此数组/vec 扩展为更多数据。
  • 所有这些都应该只在程序启动时完成一次,并且在程序执行期间不会修改数组。它只是一个全局保存的查找表,但曾经由多个模块创建。

这是我的初稿,它不起作用游乐场链接

有人可以帮忙吗?

0 投票
0 回答
122 浏览

multithreading - 延迟初始化和可变静态借用 [Rust]

我的问题如下:


是否可以对对象进行延迟初始化,然后将其借用为'static终生可变的?


一些上下文

首先,我将展示一个示例来说明延迟初始化的含义。我提出的延迟初始化模型是将 cratelazy_static与一个标准库一起使用,其中包含Mutex一个Option<T>. 这里有一个延迟初始化的例子。

您可以在Rust Playground中执行上述代码并检查它11是否正确打印。

引入需要静态生命周期的结构函数

现在,假设我在其中添加了一个函数,该函数DeferredStruct将创建一个工作线程以执行一些需要很长时间的计算:

在这种情况下,需要&mut self有一个'static生命周期:

因此,该函数将采用&'static mut self.

当试图借用as和的DeferredStruct内部Option时,问题就来了。MY_DEFERRED'staticmut

如果我不能借钱'staticmut那么我不能打电话deferred.static_function()。因为价值不会存在足够长的时间。

这里有一个Rust Playground中的最小可重现示例。

TL;博士

是否可以借用在运行时创建的对象(不一定是在程序的立即启动时创建的)在 aMutex<Option<T>>中作为可变对象并'static终身使用?

任何帮助表示赞赏。

0 投票
1 回答
47 浏览

rust - 如何改变静态引用使用大小?

这段代码给了我这些错误:

我如何变异MY_GLOBAL

0 投票
2 回答
232 浏览

memory - 如何在lazy_static 中释放内存?

文档指出,如果该类型具有析构函数,则不会调用它:https ://docs.rs/lazy_static/1.4.0/lazy_static/#semantics

那么我应该如何释放内存呢?

0 投票
1 回答
182 浏览

rust - Rust 中lazy_static 的全局 HashMap 项目的生命周期

我是 Rust 的新手。

我定义了一个Userby的全局 HashMap lazy_static

里面有一生User,所以我要在里面设置一生lazy_static。好像只能'static用在lazy_static

这是一个问题:我现在可以将“非静态”用户插入 HashMap 吗?

这是插入非静态用户的代码:

这是错误: