طول عمر در فراخوانی توابع
عمرهای مربوط به آرگومانهای تابع و مقادیر بازگشتی باید به طور کامل مشخص شوند، اما Rust اجازه میدهد عمرها در بیشتر موارد با چند قانون ساده نادیده گرفته شوند. این مسئله استنتاج نیست -- بلکه تنها یک اصطلاح نوشتاری کوتاه است.
- هر آرگومان که فاقد یک lifetime annotation است، یک عمر به آن اختصاص داده میشود.
- اگر تنها یک عمر برای آرگومان وجود داشته باشد، به تمام مقادیر بازگشتی که حاشیهنویسی نشدهاند، اختصاص داده میشود.
- اگر چندین عمر آرگومان وجود داشته باشد و اولین آن برای
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> {
این کد کامپایل نخواهد شد، که نشاندهنده این است که برچسبهای طول عمر توسط کامپایلر برای اعتبارسنجی بررسی میشوند. توجه داشته باشید که این وضعیت برای اشارهگرهای خام (ناامن) صدق نمیکند و این یکی از منابع رایج خطاها در Rust ناامن است.
دانشآموزان ممکن است بپرسند که چه زمانی باید از طول عمرها استفاده کرد. در Rust، همیشه برای قرضها طول عمر وجود دارد. بیشتر مواقع، حذف و استنباط تایپ به این معنی است که نیازی به نوشتن این طول عمرها نیست. در موارد پیچیدهتر، برچسبهای طول عمر میتوانند به حل ابهام کمک کنند. اغلب، بهویژه در هنگام پروتوتایپسازی، راحتتر است که با دادههای مالکیتشده کار کنید و مقادیر را در صورت لزوم کلون کنید.