我正在尝试理解下面的代码为什么可以编译。我原本以为无法构造 Wrapper<String>
,因为 T: 'static
并且运行时分配的字符串无法在整个程序生命周期中存在。
我认为之所以允许这样做是因为我将 T
设置为非引用类型(String
)。当我使用一个 &str
或一个包含引用的结构体时,编译器会发出我期望的错误。
然而,我在 Rust 文档中没有找到证实我的假设的任何内容,所以也许我并不完全理解规则。所有非引用类型都满足对 Wrapper<T>
的 'static
生命周期限制吗?还是有些类型会失败?
use rand::Rng;
struct Wrapper<T>
where
T: 'static,
{
value: T,
}
fn wrap_string() -> Wrapper<String> {
// Use rng to avoid construcing string at compile time
let mut rng = rand::thread_rng();
let n: u8 = rng.gen();
let text = format!("The number is {}", n);
Wrapper { value: text }
}
fn main() {
let wrapped = wrap_string();
std::mem::drop(wrapped);
}
T:'static
。这似乎与链接问题中提出的更一般的问题以及它标记为重复的问题不同。(顺便说一下,通过阅读那些答案,我无法找到这个问题的答案。) - Alistair