超越生命周期限制?

8

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

更普遍地说,我正在尝试以mem::transmutethread::spawn为基础实现一个不安全的thread::scopedspawn要求其TF参数具有'static边界,但scoped则不应该有。


2
“unsafe fn foo<'a, T>(x: T + 'a) -> T + 'static” 这个语法是无效的,没有意义。你实际上想写什么? - Chris Morgan
1
它应该接受某种具有生命周期约束的输入,并返回具有全局生命周期约束的相同类型的输出。我已经尝试澄清这篇文章,但如果我知道签名的正确语法,我就不会有问题 - 我可以使用 mem::transmute - bfops
1
更像后者。我想从一个具有一个生命周期的 T 版本转换为具有更长生命周期的 T 版本。(当然是不安全的)。 - bfops
通过使用不安全的代码,可以实现 scoped。但是,无法使用 spawn 来实现它。您可以查看源代码以了解如何在不稳定的 thread::spawn 中完成此操作。 - aochagavia
我的意思是,复制粘贴代码显然是可行的。但是似乎有点奇怪,甚至不能不安全地使用scoped来实现生成。机制基本上是相同的,不是吗?当我想要潜在地不安全地使用抽象并自己承担正确性责任时,通常会使用unsafe。以这种方式实现作用域似乎并没有根本上的错误...我错过了什么吗? - bfops
显示剩余3条评论
2个回答

16

虽然我也遇到了类似的问题,但我不建议延长生命周期约束。在这种情况下,几乎可以确定需要采取不同的方法。

话虽如此,在最新的Rust稳定版(截至本文为1.29.0)中,您可以通过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)
}

1
答案已经几年了,现在它仍然是最好的方法吗? - Joseph Garvin
1
@JosephGarvin 我没有完全跟上所有最新的发展,但我不知道还有其他方法来做到这一点。最新的1.51.0文档仍然提供了这个例子:https://doc.rust-lang.org/1.51.0/std/mem/fn.transmute.html - nfrasser

2
您现在描述的内容根本不可能。类型满足特定的生命周期要求,这是静态已知的。它们之间不能进行任何转换或类似的操作。要使您的T2的概念存在,T1必须已经是“static”。您似乎正在尝试实现的东西是完全不可能的,而且永远都不会实现。
可以使用不安全代码实现scoped,但无法使用thread::spawn实现它。您可以查看Rust 1.3.0中thread::scoped的源代码,了解如何实现它。请注意,thread::scoped已被删除,因为它存在健全性问题,因此它不是完美的示例可以直接复制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接