172 похожих чатов

Всем доброго времени суток В моей кривой обучения снова тот момент,

когда я ничего не понимаю во временах жизни

Есть такой код

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

10 ответов

18 просмотров

потому что b дропается при выходе из main соответственно его лайфтайм не 'static

Vital-L Автор вопроса
Vetro
потому что b дропается при выходе из main соответ...

сразу появляется один вопрос получается, что у main время жизни не 'static? и можно ли мейну назначить другое время жизни?

Vital L
сразу появляется один вопрос получается, что у mai...

для переменных объявленных внутри функции как правило время жизни привязано к этой функции нет, нельзя

Vital-L Автор вопроса
Vetro
для переменных объявленных внутри функции как прав...

облом заюзал либу, в которой есть функция, которая ждёт именно статик. И ради одной говёной либы не хочется все структуры в своём коде делать 'stattic возможно есть какой-то выход?

Vital-L Автор вопроса
вафля'
а что за либа?

actix-web а конкретно вот здесь App::new() .data(... как я понял - это единственный законный способ заинжектить в хэндлер роута проинициализированную структуру-сервис

И компилятор зря не предупреждает, но в имплах возвращай Self, или хотя бы B<'s>/B<'_>, чтобы явно лайфтайм был указан. В 2021 издании станет ошибкой компиляции.

Vital L
actix-web а конкретно вот здесь App::new() ...

Ну он не &'static ссылку требует, а просто T: 'static данные. Для этого действительно достаточно не хранить ссылки. Afaic data даже не требует копирования, под капотом просто Arc хранится...

Vital-L Автор вопроса
вафля'
Ну он не &'static ссылку требует, а просто T: 'sta...

внутри даты то что ты передаёщь обёрнутое в Arc

вафля'
Ну он не &'static ссылку требует, а просто T: 'sta...

nvm, в актиксе создаётся несколько App, чтобы шерить между ними всё-таки нужен свой Arc

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта