Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 区别于;p:&';a i32“;及;p:&';静态i32“;终生生锈?_Rust_Lifetime - Fatal编程技术网

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);