ν¨μ νΈμΆμμμ μλͺ
Lifetimes for function arguments and return values must be fully specified, but Rust allows lifetimes to be elided in most cases with a few simple rules. This is not inference β it is just a syntactic shorthand.
- μλͺ μ£Όμμ΄ μλ κ° μΈμμ νλμ© μ 곡λ©λλ€.
- μΈμ μλͺ μ΄ νλλ§ μλ κ²½μ° μ£Όμ μ²λ¦¬λμ§ μμ λͺ¨λ λ°ν κ°μ μ 곡λ©λλ€.
- μΈμ μλͺ μ΄ μ¬λ¬ κ° μμ§λ§ 첫 λ²μ§Έκ° βselfβμ μλͺ μ΄λ©΄ ν΄λΉ μ 체 κΈ°κ°μ μ£Όμ μ²λ¦¬λμ§ μμ λͺ¨λ λ°ν κ°μ μ 곡λ©λλ€.
#[derive(Debug)] struct Point(i32, i32); fn cab_distance(p1: &Point, p2: &Point) -> i32 { (p1.0 - p2.0).abs() + (p1.1 - p2.1).abs() } fn nearest<'a>(points: &'a [Point], query: &Point) -> Option<&'a Point> { let mut nearest = None; for p in points { if let Some((_, nearest_dist)) = nearest { let dist = cab_distance(p, query); if dist < nearest_dist { nearest = Some((p, dist)); } } else { nearest = Some((p, cab_distance(p, query))); }; } nearest.map(|(p, _)| p) } fn main() { println!( "{:?}", nearest( &[Point(1, 0), Point(1, 0), Point(-1, 0), Point(0, -1),], &Point(0, 2) ) ); }
μ΄ μμμ cab_distance
λ κ°λ¨ν μλ΅λ©λλ€.
nearest
ν¨μλ μΈμμ μ¬λ¬ μ°Έμ‘°κ° ν¬ν¨λμ΄ λͺ
μμ μ£Όμμ΄ νμν ν¨μμ λ λ€λ₯Έ μλ₯Ό μ 곡ν©λλ€.
λ°νλ μλͺ μ κ΄ν΄ βκ±°μ§λ§βνλλ‘ μλͺ μ μ‘°μ ν΄ λ³΄μΈμ.
fn nearest<'a, 'q>(points: &'a [Point], query: &'q Point) -> Option<&'q Point> {
This wonβt compile, demonstrating that the annotations are checked for validity by the compiler. Note that this is not the case for raw pointers (unsafe), and this is a common source of errors with unsafe Rust.
Students may ask when to use lifetimes. Rust borrows always have lifetimes. Most of the time, elision and type inference mean these donβt need to be written out. In more complicated cases, lifetime annotations can help resolve ambiguity. Often, especially when prototyping, itβs easier to just work with owned data by cloning values where necessary.