我正在使用FFI编写一些Rust代码,针对具有所有权概念的C API(如果有关系,则为libnotmuch API)。
API的主要入口点是Database;我可以从Database创建Query对象。它为数据库和查询(以及许多其他对象)提供了析构函数。
但是,Query不能超出其创建的Database的范围。数据库析构函数将销毁任何未销毁的查询等,此后查询析构函数不起作用。
到目前为止,我已经将基本部件组合起来 - 我可以创建数据库和查询,并对它们执行操作。但是我在编码生命周期限制方面遇到了困难。
我正在尝试做这样的事情:
我有实现
然后有一个创建查询的函数:
我不知道在
我该如何为此API建模生命周期约束?
API的主要入口点是Database;我可以从Database创建Query对象。它为数据库和查询(以及许多其他对象)提供了析构函数。
但是,Query不能超出其创建的Database的范围。数据库析构函数将销毁任何未销毁的查询等,此后查询析构函数不起作用。
到目前为止,我已经将基本部件组合起来 - 我可以创建数据库和查询,并对它们执行操作。但是我在编码生命周期限制方面遇到了困难。
我正在尝试做这样的事情:
struct Db<'a>(...) // newtype wrapping an opaque DB pointer
struct Query<'a>(...) // newtype wrapping an opaque query pointer
我有实现
Drop
的方法,它们调用底层的C析构函数。然后有一个创建查询的函数:
pub fun create_query<?>(db: &Db<?>, query_string: &str) -> Query<?>
我不知道在
?
的位置上放什么,以便查询返回值不会超出Db的生命周期。我该如何为此API建模生命周期约束?
&'a T
和&'a mut T
在'a
上始终是协变的,因此std::marker::ContravariantLifetime
不再存在。但是您必须使用声明的任何类型参数,因此现在需要使用std::marker::PhantomData
。 - cbarrick