编译时跟踪“价值所有者”的生命周期

问题描述 投票:0回答:1

是否有任何方法可以跟踪值“所有者”,以便将其传递给其他所有者是编译时错误?我一直在研究不变的生命周期和

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 中是否可能。

rust lifetime
1个回答
0
投票

这可能是不可能的,因为您需要实际的代码来创建类型/生命周期。如果您创建一个

[Owner]
Owner
的切片),每个元素都将具有相同的类型/生命周期。

类型很容易保持不变:任何没有泛型或生命周期的常规类型都是不变的,因为没有什么可以改变的。每当您想要一种独特的类型时,您都可以简单地

struct T;
,瞧!这本质上就是 typemap 发挥作用的原因。生殖力所做的唯一一件事就是让你以同样的方式度过一生。您需要更具限制性的东西:每次在运行时调用函数时都需要一个新的类型/生命周期,而这两者都无法做到。

© www.soinside.com 2019 - 2024. All rights reserved.