我试图编写一个Rust函数,它将一个生命周期约束的输入转换为具有全局生命周期约束的同一类型输出(概念上类似于unsafe fn foo<'a, T1, T2>(x: T1) -> T2 where T1: 'a, T2 = T1 + 'static
),但我可以&#39;在不添加像Box
这样的间接层的情况下,弄清楚如何编写它。有什么想法吗?
更一般地说,我试图在thread::scoped
和mem::transmute
方面实施不安全的thread::spawn
。 spawn
'static
和T
参数需要F
个界限,但scoped
会/不应该。{/ p>
答案 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)
}