rust - 如何在库中实现长期变量/状态?

标签 rust

我知道在 Rust 中实现类似全局/实例/模块变量的首选方法是在 main() 或其他常见入口点中创建所述变量,然后将其传递给任何人需要它。 似乎也可以将 lazy_static 用于不可变变量,或者它可以与 mutex 结合以实现可变变量。

在我的例子中,我使用 Rust 创建一个绑定(bind)到 Python 的 .so,我需要在 Rust 库中存储大量可变状态(以响应 Python 应用程序调用的许多不同函数调用) .

存储该状态的首选方式是什么?

是否只能通过可变的 lazy_static 方法,因为我没有 main() (或者更一般地说,任何在 Python 的函数调用之间不终止的函数),或者还有其他方法吗?

最佳答案

捆绑

一般来说,在没有其他要求的情况下,答案是将您的状态捆绑在一些对象中并将其交给客户端。一个流行的名称是 Context

然后,客户端应该必须在每个需要它的函数调用中传递对象:

  • 通过将功能定义为对象的方法。
  • 或者要求对象作为函数/方法的参数。

这给了客户端完全控制权。

客户端可能最终会为其创建一个全局变量,或者实际上可能会欣赏能够兼顾多个实例的灵 active 。

注意:不需要提供对对象内部状态的任何访问;所有客户端需要的是一个句柄(引用计数,在 Python 中)来控制生命周期并决定何时使用哪个句柄。在 C 中,这将是一个 void*


异常(exception)情况

有些情况下,例如缓存,功能不会受到影响,只会影响性能。

在这种情况下,虽然灵 active 值得赞赏,但它可能比任何事情都更像是一种负担。全局的或线程局部的,然后才有意义。

关于rust - 如何在库中实现长期变量/状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59028838/

相关文章:

rust - 如何将大 Vec<i32> 切片为 &[u8]?

rust - 什么是 "the anonymous lifetime #1"以及如何以正确的方式定义它?

generics - 如何使用闭包抽象数据和操作

reference - 当函数需要引用闭包参数时,如何将函数用作闭包?

rust - 使用 None 访问 Rust 中的嵌套 HashMap

rust - 没有为 Moved 值调用克隆?

rust - 如何使用带有 Rocket 的 abonander/multipart 解析多部分表单?

rust - 如果不满足条件,如何在 Rust 中引发错误

optimization - 我可以在 Rust 中按值有效地返回对象吗?

rust - 在 Rust 中返回一个引用和被引用的对象