تفسیرهای طول عمر
یک مرجع دارای طول عمر است که نباید از ارزش مورد اشاره بیشتر باشد. این موضوع توسط بررسیکننده قرضها تایید میشود.
طول عمر میتواند ضمنی باشد - این همان چیزی است که تا کنون مشاهده کردهایم. طول عمرها میتوانند صریح نیز باشند: &'a Point
، &'document str
. طول عمرها با '
شروع میشوند و 'a
نام پیشفرض معمولی است. &'a Point
را به عنوان "یک Point
قرضی که برای حداقل طول عمر a
معتبر است" بخوانید.
طول عمرها همیشه توسط کامپایلر استنتاج میشوند: شما نمیتوانید به طور دستی طول عمر را اختصاص دهید. انتسابهای صریح طول عمر محدودیتهایی ایجاد میکنند که در صورت وجود ابهام است؛ کامپایلر تأیید میکند که یک راهحل معتبر وجود دارد.
طول عمرها وقتی که به عبور مقادیر به توابع و بازگشت مقادیر از توابع میپردازیم پیچیدهتر میشوند.
#[derive(Debug)] struct Point(i32, i32); fn left_most(p1: &Point, p2: &Point) -> &Point { if p1.0 < p2.0 { p1 } else { p2 } } fn main() { let p1: Point = Point(10, 10); let p2: Point = Point(20, 20); let p3 = left_most(&p1, &p2); // What is the lifetime of p3? println!("p3: {p3:?}"); }
در این مثال، کامپایلر نمیداند که طول عمر p3
را چگونه استنباط کند. نگاه کردن به بدنه تابع نشان میدهد که تنها بهطور ایمن میتواند فرض کند که طول عمر p3
کوتاهتر از p1
و p2
است. اما مانند تایپها، راست نیاز به توضیحات صریح طول عمرها در آرگومانهای تابع و مقادیر بازگشتی دارد.
به تابع left_most
به صورت مناسب 'a
را اضافه کنید:
fn left_most<'a>(p1: &'a Point, p2: &'a Point) -> &'a Point {
این به این معناست که "با توجه به اینکه p1
و p2
هر دو از 'a
بیشتر عمر میکنند، مقدار بازگشتی برای مدت 'a
معتبر خواهد بود.
در موارد معمول، عمر متغیرها میتواند نادیده گرفته شود، همانطور که در اسلاید بعدی توضیح داده شده است.