抛弃终身约束?

bfo*_*ops 5 lifetime rust

我正在尝试编写一个Rust函数,该函数将一个生存期约束的输入转换为具有全局生存期约束的相同类型的输出(概念上类似unsafe fn foo<'a, T1, T2>(x: T1) -> T2 where T1: 'a, T2 = T1 + 'static),但是我不知道如何在不添加间接层的情况下编写它喜欢Box。有任何想法吗?

更一般地,我想实现一个不安全的thread::scoped来讲mem::transmutethread::spawnspawn需要'staticTF参数的界限,但scoped不是。

nfr*_*ser 9

虽然我有类似的问题,但我不建议延长生命周期约束。几乎可以肯定的是,针对出现这种情况的情况采用了不同的方法。

也就是说,您可以通过std::mem::transmute.

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

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

  • 答案已经有几年了,这仍然是最好的方法吗? (2认同)

She*_*ter 2

你现在描述的情况根本不可能。类型满足特定的生命周期要求,该要求是静态已知的。他们之间不可能有嬗变之类的事情。为了让你的概念T2存在,T1必须'static已经存在。你似乎试图实现的东西是完全不可能的,而且永远都是不可能的。

使用不安全代码可以实现scoped,但不可能用thread::spawn. 您可以查看Rust 1.3.0 中的源代码thread::scoped,了解这是如何完成的。请注意,它thread::scoped已被删除,因为它存在健全性问题,因此它不是批发复制的完美示例。