Lifetimes in Rust are annotations that tell the compiler how long references must remain valid to prevent dangling pointers. They ensure that a reference never outlives the data it points to, guaranteeing memory safety without a garbage collector. You define them using the 'a syntax on function parameters and return types to link the lifetime of a reference to the data it borrows.
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() { x } else { y }
}
In this example, the 'a lifetime parameter ensures that the returned reference lives as long as the shortest of the two input references x and y.