我正在寻找一种方法来确保结构的寿命比赋予该结构的方法的参数的寿命长。
即使结构在离开方法后不保存对该数据的引用。
这是用于馈送到 FFI 的包装原始指针。我想保证实现 FFI 的结构比Option<&'a Any>
我用来将 Rust 对象提供给指针包装器。
Context
是 FFI 包装器。Data
拥有映射到 FFI 类型的不同类型。 FFI 函数在返回之前立即复制所有这些类型。
原始指针除外。
所以我添加了一个生命周期说明符Context
只是为了那些并使用它send_data()
.
但不知怎的,这还不够。我预计下面的代码无法编译。
编辑:Rust Discord 建议制作的某人&self
mut
able in send_data()
。这达到了预期的效果,但我的 FFI 是线程安全的(且无状态的)并且send_data()
时间紧迫。所以我非常想避免这种情况。
use std::any::Any;
use std::marker::PhantomData;
struct IntegerArray<'a> {
data: &'a [i32],
}
struct WrappedRawPointer<'a> {
ptr: *const std::ffi::c_void,
_marker: PhantomData<&'a ()>,
}
impl<'a> WrappedRawPointer<'a> {
fn new(data: Option<&'a dyn Any>) -> Self {
Self {
ptr: data
.map(|p| p as *const _ as *const std::ffi::c_void)
.unwrap_or(std::ptr::null()),
_marker: PhantomData,
}
}
}
enum Data<'a, 'b> {
IntegerArray(IntegerArray<'a>),
WrappedRawPointer(WrappedRawPointer<'b>),
}
struct Context<'a> {
ctx: u32,
_marker: PhantomData<&'a ()>,
}
impl<'a> Context<'a> {
fn new() -> Self {
Self {
ctx: 0, // Call FFI to initialize context
_marker: PhantomData,
}
}
fn send_data(&self, data: Data<'_, 'a>) {
match data {
Data::IntegerArray(_i) => (), // Call FFI function
Data::WrappedRawPointer(_p) => (), // Call FFI function
}
}
}
fn main() {
let ctx = Context::new();
{
let some_float: f32 = 42.0;
ctx.send_data(
Data::WrappedRawPointer(
WrappedRawPointer::new(
Some(&some_float)
)
)
);
// I would like rustc to complain
// here that some_float does not
// outlive ctx
}
// Explicitly drop outside
// the previous block to
// prevent rustc from being
// clever
drop(ctx);
}