0 // code snippet 1
1
2 struct MutStr<'a >{
3 s: &'a mut &'a str,
4 }
5
6 fn main() {
7 let mut s: &'static str = "hello";
8 *MutStr{
9 s: &mut s,
10 }.s = "world";
11 println!("{}", s);
12 }
Rust Playground链接
code snippet 1
以上内容code snippnet 1
与Rust for Rustacean Ch1 清单 1-11 不同,其中我使用'a
替换两个生命周期'a
和'b
,并且此代码无法编译,而我无法说出原因:(
我可以分析一些简单的代码,例如以下代码(来自 Programming Rust Vers 2 page 120):
0 // code snippet 2
1
2 struct S<'a> {
3 x: &'a i32,
4 y: &'a i32
5 }
6
7 fn main() {
8 let x = 10;
9 let r;
10 {
11 let y = 20;
12 {
13 let s = S {x: &x, y: &y};
14 r = s.x;
15 }
16 }
17 println!("{}", r);
18 }
Rust Playground链接
code snippet 2
我分别表示x
、y
和r
、和'x
的 生命周期:'y
'r
'X | 'y | ' |
---|---|---|
线路:从 8 到 18 | 线路:从 11 到 16 | 线路:从 9 到 17 |
当在线实例化s
时13
,我们正在要求'x:'a ('x outlives 'a)
'y:'a
,而当分配r = s.x
发生在队列中时14
,我们正在要求'a:'r
。然而,这是不可能的,因为'y:'a
冲突'a:'r
(见上表,'y
比 短'r
),因此 rustc 无法找到'a
满足这些冲突条件的通用生命周期的确定性生命周期。
更新:我期待 code snippet 1
与上述类似的分析过程,或者遇到生命周期问题时的一般推理方法:)
我已经阅读了这篇文章,了解了一些基本概念variance
,例如covariance
invariance
和contravariance
。而且我有点认为我的问题与此有关,但不知道如何使用它来分析code snippet 1
。
顺便说一句,我仍然想知道掌握lifetime
rust 的正确位置是什么。如果你知道,请告诉我:),我很感激。
如果您发现我的问题不正常,请随时指出:)