如何在库中实现长期存在的变量/状态?

Gin*_*nty 2 rust

我知道,在Rust中实现诸如global / instance / module变量之类的首选方法是在main()或其他公共入口点中创建该变量,然后将其传递给任何需要它的人。似乎也可以将a lazy_static用于不可变变量,也可以将其与a组合mutex以实现可变变量。

就我而言,我正在使用Rust创建具有绑定到Python的.so,并且我需要在Rust库中存储大量可变状态(以响应Python应用程序调用的许多不同函数)。

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

lazy_static因为我没有main()(或者更笼统地说,没有在Python的函数调用之间不终止的任何函数),而是仅通过可变方法进行操作,还是有另一种方法呢?

Mat*_* M. 6

捆绑

通常,在没有其他要求的情况下,答案是将您的状态捆绑在某个对象中并将其移交给客户端。流行的名字是Context

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

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

这样可以完全控制客户端。

客户端可能最终为其创建了一个全局变量,或者可能实际上欣赏能够处理多个实例的灵活性。

注意:不需要提供对对象内部状态的任何访问。客户端所需的全部是一个句柄(在Python中为ref-counted),以控制生存期并决定何时使用哪个句柄。在C中,这将是void*


例外情况

在某些情况下(例如缓存),功能不会受到影响,而只会影响性能。

在这种情况下,虽然可以理解灵活性,但它可能比任何东西都要负担更多。全局的或线程局部的将是有意义的。

  • @Ginty:您不必将* internals *暴露给Python。从Python的角度来看,它只是状态Blob(在C语言中为“ void *”)的某种不透明句柄,用户将其传递给函数调用。 (4认同)