E0597
LAST_UPDATED: 2026-01-04 GROWTH: [seed] Seedling Early exploration, subject to change
Error Message
error[E0597]: `request_data` does not live long enough
--> src/main.rs:28:22
|
23 | let request_data = String::from("User Request (Short Lived)");
| ------------ binding `request_data` declared here
...
28 | request: &request_data,
| ^^^^^^^^^^^^^ borrowed value does not live long enough
...
34 | } // <--- 'request_data' dies here. 'ctx' dies here.
| - `request_data` dropped here while still borrowed
...
37 | println!("I am still alive: {}", saved_request_ref);
| ----------------- borrow later used here
Code
struct Context<'a, 'b> {
config: &'a str,
request: &'b str,
}
impl<'a, 'b> Context<'a, 'b> {
fn get_config(&self) -> &'a str {
self.config
}
fn get_request(&self) -> &'b str {
self.request
}
}
fn main() {
let config_data = String::from("Global Config (Long Lived)");
let saved_config_ref;
let saved_request_ref;
{
// Issue is here! request_data dies inside this scope!
let request_data = String::from("User Request (Short Lived)");
// Creates the context holding both
let ctx = Context {
config: &config_data,
request: &request_data,
};
// We extract the config reference
saved_config_ref = ctx.get_config();
saved_request_ref = ctx.get_request();
} // <--- 'request_data' dies here. 'ctx' dies here.
println!("I am still alive: {}", saved_config_ref);
println!("I am still alive: {}", saved_request_ref);
}
Fix
fn main() {
let config_data = String::from("Global Config (Long Lived)");
let saved_config_ref;
let saved_request_ref;
// moved here to maintain lifetime scope
let request_data = String::from("User Request (Short Lived)");
{
// Creates the context holding both
let ctx = Context {
config: &config_data,
request: &request_data,
};
// We extract the config reference
saved_config_ref = ctx.get_config();
saved_request_ref = ctx.get_request();
} // <--- 'request_data' dies here. 'ctx' dies here.
println!("I am still alive: {}", saved_config_ref);
println!("I am still alive: {}", saved_request_ref);
}