خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

درک قرض گرفتن در زنگ

وام گرفتن موضوعی پیچیده است که به مالکیت مربوط می شود. درک آن کلید کار با مدیریت حافظه در Rust است.

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

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

قرض گرفتن در رست چیست؟

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

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

نمونه ای از قرض گرفتن در زنگ

شما می توانید مالکیت یک متغیر را با ارجاع به مالک با استفاده از علامت علامت (&) قرض بگیرید.

fnmain() {
    let x = String::from("hello"); // x owns "hello"
    let y = &x; // y references x, borrows "hello"
    println!("{}", x);
    println!("{}", y)
}

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

fnprint_even(vectr: &Vec<i32>) {
    for values in vectr {
        if values % 2 == 0 {
            println!("{}", values);
        }
    }
}

تابع print_even به بردار اعداد صحیح 32 بیتی به عنوان آرگومان ارجاع می دهد. سپس خطوطی از مقادیر را با استفاده از حلقه for و println چاپ می کند که مضرب دو در بردار هستند! ماکرو

fnmain() {
    let number_vector = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
    print_even(&number_vector); // ownership is borrowed, not moved

    println!("The main function retains ownership of the number vector{:?}", number_vector)
}

تابع main متغیر number_vector را اعلام می کند و بردار اعداد صحیح 32 بیتی را به آن اختصاص می دهد. سپس تابع print_even را فراخوانی می کند و با استفاده از علامت آمپرسند، آن را مرجعی به متغیر number_vector می دهد.

مطلب مرتبط:   دستکاری رشته در Go: نحوه به روز رسانی متن

تابع اصلی مالکیت متغیر number_vector را حفظ می کند و می تواند به استفاده از مقدار در محل حافظه خود ادامه دهد.

نتیجه استقراض با ارجاع در Rust

منابع وام گرفتن و جهش

توابع همچنین می توانند متغیرهای قرض گرفته شده را با استفاده از ارجاعات قابل تغییر به آنها، قبل از بازگرداندن مالکیت تغییر دهند.

با این حال، بر خلاف متغیرهای معمولی که می‌توان با استفاده از کلمه کلیدی mut روی mutable تنظیم کرد، باید ارجاعات قابل تغییر را با علامت آمپراند پیشوند قرار دهید.

قبل از ایجاد ارجاعات قابل تغییر، متغیری که می خواهید تغییر دهید باید قابل تغییر باشد.

fnremove_value(vectr: &mutVec<i32>) -> &Vec<i32> {
    vectr.remove(4);
    return vectr
}

تابع remove_value مرجع یک بردار قابل تغییر از اعداد صحیح 32 بیتی را می گیرد. پس از حذف مقدار بردار در شاخص چهارم، بردار اعداد صحیح 32 بیتی را برمی گرداند.

fnmain() {
    letmut nums = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
    remove_value(&mut nums); // mutable reference here
    println!("{:?}", nums);
}

این تابع با فراخوانی remove_value و ارسال مرجع قابل تغییر یک بردار به عنوان آرگومان، بردار nums را تغییر می‌دهد. در چاپ بردار، شاخص چهارم قبلی بردار وجود ندارد.

توجه داشته باشید که آرگومان ارجاع به یک بردار قابل تغییر است.

نتیجه قرض گرفتن و جهش مراجع در Rust

درک مالکیت و قرض گرفتن بسیار مهم است

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

مطلب مرتبط:   نحوه مستندسازی کد پایتون با استفاده از Docstrings

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