是否有任何方法可以跟踪值“所有者”,以便将其传递给其他所有者是编译时错误?我一直在研究不变的生命周期和
generativity
板条箱,但我的 rust-fu 还不能完全胜任这项任务。
代码可能解释了我正在努力做到最好的事情:
use core::marker::PhantomData;
// The lifetime `'a` is somehow only valid for the `Bar` that created `Foo`
#[derive(Default, Copy, Clone)]
struct Foo<'a> {
phantom: PhantomData<&'a Owner>,
}
#[derive(Default)]
struct Owner {}
impl Owner {
fn get<'a, 'b: 'a>(&'a self) -> Foo<'b> {
Foo::<'b>::default();
}
// Somehow requires that the unique lifetime of `self` applies also to `Foo`.
fn set<'a>(&'a mut self, _foo: Foo<'a>) {
// whatever code
}
}
fn main() {
let mut owner = Owner::default();
let mut owner2 = Owner::default();
let anon_foo = Foo::default();
let foo2 = owner2.get();
owner.set(foo2); // should not compile
owner.set(anon_foo); // also should not compile
owner2.set(foo2); // compiles!
}
这是一个相当理论化的问题,我并不是想解决一个具体问题,只是想看看这种零成本抽象构造在 Rust 中是否可能。
这可能是不可能的,因为您需要实际的代码来创建类型/生命周期。如果您创建一个
[Owner]
(Owner
的切片),每个元素都将具有相同的类型/生命周期。
类型很容易保持不变:任何没有泛型或生命周期的常规类型都是不变的,因为没有什么可以改变的。每当您想要一种独特的类型时,您都可以简单地
struct T;
,瞧!这本质上就是 typemap 发挥作用的原因。生殖力所做的唯一一件事就是让你以同样的方式度过一生。您需要更具限制性的东西:每次在运行时调用函数时都需要一个新的类型/生命周期,而这两者都无法做到。