когда я ничего не понимаю во временах жизни
Есть такой код
rust
struct A {
}
struct B<'s> {
a: &'s A,
}
impl <'s> B <'s> {
pub fn new(a: &'s A) -> B {
B {
a,
}
}
}
struct C {
b: &'static B<'static>,
}
impl C {
pub fn new (b: &'static B) -> C {
C {
b
}
}
}
fn main() {
let a = A {};
let b = B::new(&a);
let c = C::new(&b);
}
и вот такой вывод
⣿
Standard Error
Compiling playground v0.0.1 (/playground)
warning: unused variable: `c`
--> src/main.rs:33:9
|
33 | let c = C::new(&b);
| ^ help: if this is intentional, prefix it with an underscore: `_c`
|
= note: `#[warn(unused_variables)]` on by default
error[E0597]: `a` does not live long enough
--> src/main.rs:32:20
|
32 | let b = B::new(&a);
| -------^^-
| | |
| | borrowed value does not live long enough
| argument requires that `a` is borrowed for `'static`
33 | let c = C::new(&b);
34 | }
| - `a` dropped here while still borrowed
error[E0597]: `b` does not live long enough
--> src/main.rs:33:20
|
33 | let c = C::new(&b);
| -------^^-
| | |
| | borrowed value does not live long enough
| argument requires that `b` is borrowed for `'static`
34 | }
| - `b` dropped here while still borrowed
error: aborting due to 2 previous errors; 1 warning emitted
For more information about this error, try `rustc --explain E0597`.
error: could not compile `playground`
To learn more, run the command again with --verbose.
ссылка на плейграунд https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=700996a357032e44c8d9858fe30ffe03
не понимаю, почему для a и для b не применяется время жизни 'static
потому что b дропается при выходе из main соответственно его лайфтайм не 'static
сразу появляется один вопрос получается, что у main время жизни не 'static? и можно ли мейну назначить другое время жизни?
для переменных объявленных внутри функции как правило время жизни привязано к этой функции нет, нельзя
облом заюзал либу, в которой есть функция, которая ждёт именно статик. И ради одной говёной либы не хочется все структуры в своём коде делать 'stattic возможно есть какой-то выход?
actix-web а конкретно вот здесь App::new() .data(... как я понял - это единственный законный способ заинжектить в хэндлер роута проинициализированную структуру-сервис
И компилятор зря не предупреждает, но в имплах возвращай Self, или хотя бы B<'s>/B<'_>, чтобы явно лайфтайм был указан. В 2021 издании станет ошибкой компиляции.
Ну он не &'static ссылку требует, а просто T: 'static данные. Для этого действительно достаточно не хранить ссылки. Afaic data даже не требует копирования, под капотом просто Arc хранится...
внутри даты то что ты передаёщь обёрнутое в Arc
nvm, в актиксе создаётся несколько App, чтобы шерить между ними всё-таки нужен свой Arc
Обсуждают сегодня