几天前我开始学习锈病。
这是吉姆·布兰迪( Jim )的著名著作“编程铁锈”( Programming )的摘录。
为代码
fn g<'a>(p: &'a i32) { ... }
let x = 10;
g(&x);书上说
铁锈为&x选择最小的生命周期,即对g的调用。这满足了所有的限制:它不超过x,并包含对g的整个调用。所以代码必须集合起来。
Q1。&x的最小生命周期是什么意思?
为代码
fn f(p: &'static i32) { ... }
let x = 10;
f(&x);Q2。为什么这段代码会失败?根据我的理解,&'static用于静态全局变量,这些变量存在于完整的程序中。链接
发布于 2019-10-04 18:43:02
'static生命周期是一个特殊的概念。它指定此引用的变量需要存在于程序的整个生命期。使用这是一种罕见的情况,需要更少的预防措施来实现。
实际上,&'static引用只能在两种情况下发生:
const声明static声明两者都以不同的方式有效地完成了相同的事情;然而,差异对这个问题并不重要。在这两种情况下,结果都是一个变量,可用于整个程序生命周期,并且不会被重新定位,从而保证了如果借用了&'static。
既然我们已经讨论了这个问题,让我们来讨论一下你们的两个问题。
Q1。对于&x来说,最小的寿命意味着什么?
当您将函数定义为fn g<'a>(p: &'a i32) { ... }时,您要求p在一个生存期'a中有效;此生存期由编译器确定,因此'a是最小的可能的。例如,如果引用从未在函数作用域之外使用,则'a将是该函数执行的生命周期。如果您在函数之外使用或引用此“借”,则生存期将(显然)更大。
“最小可能”的定义很简单:编译器将根据从开始引用到上次使用该引用的时间来推断生命周期。依赖借款也很重要,在处理集合时,这种情况通常会影响到人们。
它之所以是最小的,是因为这样你就不会遇到疯狂的情况:你没有借来,但它还是借来的;这通常发生在你试图提供你自己的、不正确的、终生的暗示时。在很多情况下,通常最好由编译器来决定;另一种情况是struct实现,如下所示:
struct Foo<'a> {
item: &'a u32
}
impl<'a> Foo<'a> {
pub fn compare<'b>(&self, other: &'b u32) {
...
}
}在这种情况下,常见的错误是将other描述为'a,而不是定义第二个'b生命期的,因此(意外地)需要在struct本身的生存期内借用other。
Q2。为什么这段代码会失败?根据我的理解,&‘静态是用于整个程序的静态全局变量。
let x = 10;此赋值没有'static生存期。它的匿名生存期定义为小于'static,因为它不是严格地定义为全局的。获取'static的惟一方法是将源元素定义为const或static。
您可以通过以下代码片段(游乐场)来说服自己:
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);发布于 2019-10-04 17:21:06
引用上的'static生存期要求为程序的全局生存期声明此参数,但x无法满足此条件,因为它是在执行过程中声明的。
为了能够使用它,请将x声明为const或static,因此它的生存期为'static,并且代码运行良好。
https://stackoverflow.com/questions/58240646
复制相似问题