抛弃终身限制?

时间:2015-06-27 14:24:32

标签: rust lifetime

我试图编写一个Rust函数,它将一个生命周期约束的输入转换为具有全局生命周期约束的同一类型输出(概念上类似于unsafe fn foo<'a, T1, T2>(x: T1) -> T2 where T1: 'a, T2 = T1 + 'static),但我可以&#39;在不添加像Box这样的间接层的情况下,弄清楚如何编写它。有什么想法吗?

更一般地说,我试图在thread::scopedmem::transmute方面实施不安全的thread::spawnspawn 'staticT参数需要F个界限,但scoped会/不应该。{/ p>

2 个答案:

答案 0 :(得分:3)

你现在描述的是根本不可能的。类型满足一定的寿命要求,这是静态已知的。他们之间不可能有嬗变或类似的东西。对于T2存在的概念,T1必须已'static。你似乎试图实现的是完全不可能的,而且永远都是。

可以使用不安全的代码实现scoped,但无法根据thread::spawn实现它。您可以查看source code of thread::scoped in Rust 1.3.0以了解如何完成此操作。请注意thread::scoped已删除,因为它有soundness issues,所以它不是复制批发的完美示例。

答案 1 :(得分:1)

尽管我有类似的问题,但我不建议延长寿命限制。几乎可以肯定的是,对于出现这种情况的情况,可以采用不同的方法。

也就是说,您可以通过std::mem::transmute来延长最新的Rust稳定版(在撰写本文时为1.29.0)的寿命。

文档中的示例(警告:“ 这是高级的,非常不安全的Rust!”):

struct R<'a>(&'a i32);
unsafe fn extend_lifetime<'b>(r: R<'b>) -> R<'static> {
    std::mem::transmute::<R<'b>, R<'static>>(r)
}