我知道,在Rust中实现诸如global / instance / module变量之类的首选方法是在main()或其他公共入口点中创建该变量,然后将其传递给任何需要它的人。似乎也可以将a lazy_static用于不可变变量,也可以将其与a组合mutex以实现可变变量。
就我而言,我正在使用Rust创建具有绑定到Python的.so,并且我需要在Rust库中存储大量可变状态(以响应Python应用程序调用的许多不同函数)。
存储该状态的首选方式是什么?
是lazy_static因为我没有main()(或者更笼统地说,没有在Python的函数调用之间不终止的任何函数),而是仅通过可变方法进行操作,还是有另一种方法呢?
通常,在没有其他要求的情况下,答案是将您的状态捆绑在某个对象中并将其移交给客户端。流行的名字是Context。
然后,客户端应在每个需要它的函数调用中传递该对象:
这样可以完全控制客户端。
客户端可能最终为其创建了一个全局变量,或者可能实际上欣赏能够处理多个实例的灵活性。
注意:不需要提供对对象内部状态的任何访问。客户端所需的全部是一个句柄(在Python中为ref-counted),以控制生存期并决定何时使用哪个句柄。在C中,这将是void*。
在某些情况下(例如缓存),功能不会受到影响,而只会影响性能。
在这种情况下,虽然可以理解灵活性,但它可能比任何东西都要负担更多。全局的或线程局部的将是有意义的。