Rust 区别于;p:&';a i32“;及;p:&';静态i32“;终生生锈?
几天前我开始学习生锈 这是吉姆·布兰迪的著名著作《编程锈》的摘录 对于代码Rust 区别于;p:&';a i32“;及;p:&';静态i32“;终生生锈?,rust,lifetime,Rust,Lifetime,几天前我开始学习生锈 这是吉姆·布兰迪的著名著作《编程锈》的摘录 对于代码 fn g<'a>(p: &'a i32) { ... } let x = 10; g(&x); fn f(p: &'static i32) { ... } let x = 10; f(&x); 问题2。为什么这个代码会失败?根据我的理解,&'static用于整个程序的静态全局变量 A引用的静态生存期要求在程序的全局生存期内声明此参数,但x无法满足此条件,因为它是在执行过
fn g<'a>(p: &'a i32) { ... }
let x = 10;
g(&x);
fn f(p: &'static i32) { ... }
let x = 10;
f(&x);
问题2。为什么这个代码会失败?根据我的理解,
&'static
用于整个程序的静态全局变量 A引用的静态
生存期要求在程序的全局生存期内声明此参数,但x
无法满足此条件,因为它是在执行过程中声明的
为了能够使用它,将x声明为
const
或static
,这样它的生存期将是'static
,代码将正常工作。A'static
生存期是一个特殊的概念。它指定此引用的变量需要在程序的整个生命周期内存在。使用这是一种罕见的情况,需要更罕见的预防措施才能实现
实际上,&“静态
引用仅在两种情况下发生:
- A
声明const
- A
声明静态
&'static
(如果借用)
既然我们已经讨论了这一点,让我们来讨论你们的两个问题
问题1。什么是&x的最小可能寿命
当您将函数定义为
fn时,gI同意将x声明为静态或常量将解决问题,但如果变量的生存期小于函数定义中提到的引用变量,则它应该可以工作<代码>x
生存期将短于静态
生存期。引用和被引用是否必须具有相同的生存期?@AdityaArora您弄错了:输入变量的生存期至少需要与函数声明中指定的一样长。@trentcl代码示例是由PitaJ添加的,不是OP的。编辑应该被标记并回滚。@JussiKukkonen为什么不能小于函数声明中指定的值?“我同意更大的压力会产生问题。”阿迪蒂亚罗拉补充了我自己的答案,试图澄清一些事情。如果有什么不清楚的地方,请告诉我;但是,这是一个很长的问题。Q2似乎是它自己的答案:x
不是一个静态全局变量,因此代码失败。在我看来,这就像是一个重复的问题。这个问题的答案是否也回答了你的问题?谢谢@SébastienRenauld提供了结构良好的答案和示例。另一方面,将代码块1的struct Foo中的&'a
替换为&'static
会起作用吗?@AdityaArora可能()但极为罕见。由于对内部引用的要求是&'static
,因此,实际上唯一适合的是static
或const
定义。由于static
定义不允许初始化(如果没有lazy\u static
),因此您可以使用的功能非常有限。
struct Foo<'a> {
item: &'a u32
}
impl<'a> Foo<'a> {
pub fn compare<'b>(&self, other: &'b u32) {
...
}
}
let x = 10;
fn f(p: &'static i32) {
println!("{}", p)
}
const FOO:i32 = 3;
static BAR:i32 = 4;
fn main() {
f(&FOO); // Works
f(&BAR); // Also works
}
f(&x);