做
Cat { coolness: &c }
扩展到
Cat { coolness: &'a &'a i32 }
?
是的
Cat
以引用结束。这可以通过以下代码编译来演示:
let fluffy = Cat { coolness: &c };
fn is_it_a_double_ref(_x: &Cat<&i32>) {}
is_it_a_double_ref(&fluffy);
然而,每个引用的生存期不一定相同。
我的理解是,编译器看到内部&超出外部(&A);
这是正确的。这正是
T: 'a
束缚开始发挥作用。
生命周期界限一开始有点难以理解。他们对
T
. 例如,给定边界
T: 'static
,不包含任何引用或仅包含
'static
参考资料,例如。
i32
和
&'static str
,满足绑定,而包含-
'静态
参考资料,例如。
&'a i32
,不要,因为
'a: 'static
为false。更一般地说,给定界限
T: 'a
,类型
T
对于每个生存期参数,满足界限if
'x
在…上
T
,
'x: 'a
为true(没有生存期参数的类型通常满足该界限)。
现在回到您的代码。让我们给这些参考资料起一些名字。我们会说
coolness
是
&'fluffy &'c i32
.
'c
是变量的生存期
c
和
'fluffy
是变量的生存期
fluffy
(与直觉相反,生存期编码的是借用的范围,而不是引用的生存期,尽管编译器确实检查借用没有超出引用的生存期)。这意味着
Fluffy
是
Cat<'fluffy, &'c i32>
. 是真的吗
&'c i32: 'fluffy
?
检查是否
&'c i32:'毛茸茸的
是真的,我们需要检查
'c: 'fluffy
是真的。
c:毛茸茸的
是true,因为变量
c
之后超出范围
毛茸茸的
.