Can you explain Rust lifetimes in simple language?
Rust lifetimes are a way for the Rust compiler to understand how long a reference to a piece of data is valid.

In Rust, every variable has a lifetime, which is the duration of time that the variable is valid and accessible. Lifetimes are represented using an apostrophe symbol (') followed by a name. For example, the lifetime 'a indicates that the variable or reference it is attached to is valid for the duration of 'a.

When working with references in Rust, the lifetime of the reference must be specified to ensure that it does not refer to data that has been deallocated or is no longer valid. This is because Rust's ownership model ensures that there is always only one owner of a piece of data at any given time.

Lifetimes are specified using a syntax similar to generics. For example, a function that takes two references with different lifetimes might be defined like this:

```rust
fn foo<'a, 'b>(x: &'a i32, y: &'b i32) -> i32 {
    // ...
}
```
In this example, the function foo takes two references with lifetimes 'a and 'b, respectively. The compiler will ensure that both references are valid for the duration of the function call.

Lifetimes can be used to specify the relationship between multiple references to the same data, and can be used to prevent common programming mistakes like dangling references or data races.
Rust it's a piss of the shit