برنامه نویسی

راهنمای بی نظیر برای مالکیت زنگ: بر هنر مدیریت حافظه مسلط شوید و پتانسیل واقعی کد خود را باز کنید

سلام، روستایی ها! برای یک شیرجه عمیق در دنیای شگفت انگیز مالکیت Rust آماده هستید؟ همانطور که می دانید، Rust به لطف رویکرد منحصر به فرد خود در مدیریت حافظه، یک تغییر دهنده بازی در حوزه برنامه نویسی سیستم است. امروز، ما قصد داریم تا قدرت باورنکردنی سیستم مالکیت Rust را بررسی کنیم و پتانسیل واقعی کد شما را باز کنیم. بیا شروع کنیم!

درک مالکیت در رست 🔐

مالکیت سس مخفی Rust است – یک رویکرد منحصر به فرد برای مدیریت حافظه که نیاز به جمع آوری زباله را از بین می برد و احتمال بروز اشکالات را به طور چشمگیری کاهش می دهد. در هسته سیستم مالکیت Rust سه قانون کلیدی وجود دارد:

  • هر مقدار در Rust دارای یک متغیر است که مالک آن نامیده می شود.
  • یک ارزش در هر زمان فقط می تواند یک مالک داشته باشد.
  • هنگامی که مالک از محدوده خارج می شود، مقدار به طور خودکار توزیع می شود.

درک این قوانین برای نوشتن کد Rust ایمن و کارآمد ضروری است. بیایید هر یک از آنها را با جزئیات بیشتری بررسی کنیم.

قانون شماره 1: اصل مالکیت واحد 👑

در Rust، هر مقدار دارای یک متغیر است که “مالک” آن است. این سیستم مالکیت تضمین می کند که حافظه به طور قابل پیش بینی و ایمن تخصیص و توزیع می شود. وقتی مالکیت از یک متغیر به متغیر دیگر منتقل می شود (مثلاً از طریق فراخوانی انتساب یا تابع)، متغیر اصلی دیگر به مقدار دسترسی ندارد.

fn main() {
    let s1 = String::from("hello");
    let s2 = s1;

    // The following line will result in a compile-time error,
    // because s1 no longer has ownership of the value.
    // println!("{}, world!", s1);
    println!("{}, world!", s2); // This line will work correctly.
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این مثال ابتدا یک مقدار String ایجاد می کنیم و آن را به متغیر متصل می کنیم s1. سپس اختصاص می دهیم s1 به s2، که مالکیت ارزش را به s2. در این مرحله، s1 دیگر به مقدار دسترسی ندارد و تلاش برای استفاده از آن منجر به خطای زمان کامپایل می شود.

قانون شماره 2: خط مشی مالکیت انحصاری 💼

Rust مالکیت انحصاری را اعمال می کند، به این معنی که یک ارزش می تواند تنها یک مالک در یک زمان داشته باشد. این امکان رقابت داده ها را از بین می برد و تضمین می کند که حافظه به درستی توزیع می شود. وقتی مالکیت منتقل می شود، گفته می شود که متغیر اصلی مقدار را به مالک جدید “انتقال” داده است.

fn main() {
    let s1 = String::from("hello");
    let s2 = s1;

    // The following line will result in a compile-time error,
    // because s1 has moved the value to s2, and it cannot be used again.
    // println!("{}, world!", s1);
    println!("{}, world!", s2); // This line will work correctly.
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این مثال مشابه نمونه قبلی است، اما جنبه مالکیت انحصاری را برجسته می کند. وقتی تعیین می کنیم s1 به s2، مالکیت منتقل می شود و دیگر نمی توان از طریق آن به ارزش دسترسی داشت s1. این امر مالکیت انحصاری را اعمال می‌کند و تضمین می‌کند که وقتی مقدار از محدوده خارج می‌شود، حافظه به درستی توزیع می‌شود.

قانون شماره 3: تخصیص خودکار در خروجی Scope 🗑️

وقتی مالک یک مقدار از محدوده خارج می شود، Rust به طور خودکار حافظه مرتبط با مقدار را اختصاص می دهد. این تضمین می کند که حافظه همیشه به درستی آزاد می شود و از نشت و نشانگرهای آویزان جلوگیری می کند. جادوی سیستم مالکیت Rust این است که ایمنی حافظه را بدون نیاز به جمع‌آوری زباله در زمان اجرا تضمین می‌کند!

fn main() {
    let s = String::from("hello");
    takes_ownership(s);

    // The following line will result in a compile-time error,
    // because the value was deallocated when takes_ownership() completed.
    // println!("s: {}", s);
}

fn takes_ownership(some_string: String) {
    println!("some_string: {}", some_string);
} // Here, some_string goes out of scope and the memory is deallocated.

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این مثال، یک مقدار String ایجاد می کنیم و آن را به آن ارسال می کنیم takes_ownership تابع. وقتی تابع کامل شد، مالک مقدار (some_string) از محدوده خارج می شود و Rust به طور خودکار حافظه مرتبط با مقدار را اختصاص می دهد. تلاش برای استفاده از s پس از فراخوانی تابع منجر به یک خطای زمان کامپایل می شود زیرا مقدار آن جابجا شده است.

قرض و مادام العمر: The Dynamic Duo 🦸🏻‍♂️🦸🏽‍♀️

سیستم مالکیت Rust با قرض گرفتن و طول عمر تکمیل می شود که به شما امکان می دهد بدون در نظر گرفتن مالکیت ارجاعاتی به ارزش ها ایجاد کنید. این به شما امکان می‌دهد تا داده‌ها را در بخش‌های مختلف کد خود به اشتراک بگذارید، در حالی که همچنان به قوانین مالکیت Rust پایبند هستید.

  • قرض گرفتن: می توانید ارجاعات غیرقابل تغییر (فقط خواندنی) یا قابل تغییر (خواندن-نوشتن) به مقادیر ایجاد کنید. این به شما امکان می دهد بدون انتقال مالکیت داده ها را به اشتراک بگذارید.
  • طول عمر: طول عمر اطمینان حاصل می کند که منابع از داده هایی که به آنها اشاره می کنند بیشتر زنده نمی مانند. با حاشیه نویسی کد خود با پارامترهای طول عمر، اطلاعاتی را که به کامپایلر Rust برای تقویت ایمنی حافظه نیاز دارد، می دهید.
fn main() {
    let s1 = String::from("hello world");

    let word = first_word(&s1); // Borrow s1 as an immutable reference

    println!("The first word is: {}", word);
}

// The function signature includes a lifetime parameter 'a'
// which indicates that the reference to str and the returned &str have the same lifetime.
fn first_word<'a>(s: &'a str) -> &'a str {
    let bytes = s.as_bytes();

    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[0..i];
        }
    }

    &s[..]
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این مثال یک String داریم s1، و می خواهیم اولین کلمه را در آن پیدا کنیم. ما استفاده می کنیم first_word تابع، که یک ارجاع تغییرناپذیر به یک قطعه رشته می گیرد (&str). در داخل تابع، اولین کاراکتر فاصله را جستجو می کنیم و یک تکه از رشته اصلی را تا آن نقطه برمی گردانیم.

توجه داشته باشید که امضای تابع شامل یک پارامتر طول عمر است 'a. این نشان می دهد که مرجع ورودی و مرجع برگشتی دارای طول عمر یکسانی هستند. طول عمر تضمین می کند که مرجع برگشتی تا زمانی که مرجع ورودی معتبر است، معتبر باقی می ماند.

در تابع main، ما first_word را با ارجاع قرضی به فراخوانی می کنیم s1، اطمینان حاصل شود که مالکیت را منتقل نمی کنیم. را first_word تابع یک مرجع تغییرناپذیر به کلمه اول برمی گرداند و ما آن را چاپ می کنیم.

این مثال وام گرفتن را با استفاده از مراجع برای دسترسی به داده های اصلی بدون انتقال مالکیت و مادام العمر با اطمینان از معتبر ماندن مراجع برای مدت زمان مورد نیاز نشان می دهد.


شما آن را دارید – دنیای شگفت انگیز مالکیت Rust، با شکوه تمام! با درک و تسلط بر این مفاهیم، ​​به خوبی در راه نوشتن کد Rust ایمن، کارآمد و قدرتمند خواهید بود. بنابراین، دوستان روستایی، مالکیت Rust چگونه سفر برنامه نویسی شما را متحول کرده است؟ با چه چالش هایی روبرو بوده اید و چه پیروزی هایی کسب کرده اید؟ نظرات، تجربیات و دیدگاه های خود را در نظرات زیر به اشتراک بگذارید! 🚀

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا