ํจ์ ํธ์ถ์์์ ์๋ช
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.