mirror of
https://github.com/ahgamut/rust-ape-example.git
synced 2024-05-15 10:02:42 +00:00
42 lines
1.3 KiB
Rust
42 lines
1.3 KiB
Rust
// ./src/scope/lifetime/explicit.md
|
|
|
|
|
|
// `print_refs` takes two references to `i32` which have different
|
|
// lifetimes `'a` and `'b`. These two lifetimes must both be at
|
|
// least as long as the function `print_refs`.
|
|
fn print_refs<'a, 'b>(x: &'a i32, y: &'b i32) {
|
|
println!("x is {} and y is {}", x, y);
|
|
}
|
|
|
|
// A function which takes no arguments, but has a lifetime parameter `'a`.
|
|
fn failed_borrow<'a>() {
|
|
// let _x = 12;
|
|
|
|
// ERROR: `_x` does not live long enough
|
|
// let y: &'a i32 = &_x;
|
|
// Attempting to use the lifetime `'a` as an explicit type annotation
|
|
// inside the function will fail because the lifetime of `&_x` is shorter
|
|
// than that of `y`. A short lifetime cannot be coerced into a longer one.
|
|
}
|
|
|
|
fn part0() {
|
|
// Create variables to be borrowed below.
|
|
let (four, nine) = (4, 9);
|
|
|
|
// Borrows (`&`) of both variables are passed into the function.
|
|
print_refs(&four, &nine);
|
|
// Any input which is borrowed must outlive the borrower.
|
|
// In other words, the lifetime of `four` and `nine` must
|
|
// be longer than that of `print_refs`.
|
|
|
|
failed_borrow();
|
|
// `failed_borrow` contains no references to force `'a` to be
|
|
// longer than the lifetime of the function, but `'a` is longer.
|
|
// Because the lifetime is never constrained, it defaults to `'static`.
|
|
}
|
|
|
|
pub fn main() {
|
|
part0();
|
|
}
|
|
|