error[E0506]: cannot assign to `y` because it is borrowed
--> src/main.rs:13:5
11 | x.b = &y;
| -- borrow of `y` occurs here
12 | x.b = &0;
13 | y = 3;
| ^^^^^ assignment to borrowed `y` occurs here
14 | println!("x: {:?}", x.b);
| --- borrow later used here
И, вроде, понятно, что это завязанный на структуру 'a виноват и понятно что это меняет время жизни y, но почему именно y считается одолженным в этой ситуации?
Похоже, вариант от @Kolsky лучше всего поясняет как именно оно происходит:
X живёт 'a;
Лайфтайм &0 свободно сокращается до 'a;
Одалживаем y, следовательно, 'a живёт максимум как скоуп функции, и одалживание y становится 'a;
x живёт и валидна как минимум до строчки с println;
'a продлевается до println;
y, одолженное на 'a, было перезаписано раньше срока одалживания.
Типа можно было бы усложнить анализ NLL для !Drop и сказать, что часть полей всё ещё доступна после окончания лайфтайма, но тут уже семантика слегка изменится
Строковые литералы ("abc") - один из видов литералов, да. Но литералы бывают всякие - 0 целочисленный, 0.0_f32 - флоатовый, () - юнит, true - булевый, MyStruct { my_field: 0 } - структурный. Литерал - просто “буквальная” форма записи некого значения.
почему static, т.к. задана в явном виде?
потому что этот 0 будет жить (в text секции собранного бинаря, например) на протяжении жизни всего приложения, а этот ВЖ называется 'static.