اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
دو دقیقه
Rust، یک زبان برنامه نویسی است که به دلیل ایمنی و عملکرد مشهور است و مفهوم مالکیت را برای مدیریت مؤثر حافظه معرفی میکند. با رعایت مجموعهای از قوانین زمان کامپایل، توسعه دهندگان Rust میتوانند مشکلات مربوط به حافظه را کاهش داده و کد خود را بهینه کنند. این مقاله، قوانین مالکیت، مشکلاتی را که حل میکند و مثالهای مختلفی را برای نشان دادن کاربرد آن، بررسی میکند.
قوانین مالکیت
مالکیت در Rust به جلوگیری از چندین مشکل مدیریت حافظه کمک میکند، از جمله:
هر مقدار در Rust دارای یک متغیر مرتبط به نام مالک آن است
به مثال زیر توجه کنید:
در این مورد، s1 یک اشارهگر است که در stack قرار دارد؛ در حالیکه مقدار "Rust" در heap قرار میگیرد.
طبق قوانین مالکیت:
تلاش برای ارجاع به s1 پس از خارج شدن آن از scope، منجر به خطا میشود؛ زیرا مقدار آن از heap حذف شده و دیگر وجود ندارد.
مالکیت منحصر بهفرد (در هر لحظه فقط یک مالک میتواند وجود داشته باشد)
اگر برای انتقال s1 به s2 از کد زیر استفاده کنید:
Rust بهطور خودکار مقدار s1 را به s2 منتقل میکند و اطمینان حاصل میکند که تنها یک مالک در یک زمان حضور دارد.
Cloning Values
اگر بخواهیم بجای جابجایی مقدار، آن را تولید/نمونهسازی مجدد (cloning) کنیم، میتوانیم با فراخوانی متد ()clone اینکار را انجام دهیم:
اکنون s2 کپی خود را از مقدار s1 دارد.
Primitive Data و Cloning
در Rust، دادههای اولیه بهطور کامل در stack ذخیره میشوند و بهطور پیش فرض clone میشوند. نمونه سازی مجدد این انواع، ارزان است و تفاوتی بین clone و moving وجود ندارد.
پاس دادن Variables به Functions
ارسال یک متغیر به یک تابع، همان تأثیری را دارد که یک متغیر را به متغیر دیگری اختصاص میدهیم. به عنوان مثال، اگر s1 را به یک تابع ارسال کنیم، مالک جدید رشته p1 است ( p1 نام آرگومان تابع است). برای رفع هرگونه خطایی که ممکن است به این دلیل ایجاد شود، میتوانیم s1 را clone کرده و به تابع ارسال کنیم.
سیستم مالکیت Rust، یک راه قدرتمند را برای مدیریت حافظهی در زمان کامپایل فراهم میکند و از مشکلات رایج مرتبط با حافظه جلوگیری میکند. با درک و پیروی از قوانین مالکیت، میتوانید کد ایمنتر و کارآمدتری را در Rust بنویسید.
قوانین مالکیت
- هر مقدار در Rust دارای یک متغیر مرتبط به نام مالک آن است.
- در هر لحظه فقط یک مالک میتواند وجود داشته باشد.
- وقتی مالک از scope خارج میشود، مقدار مرتبط حذف میشود.
مالکیت در Rust به جلوگیری از چندین مشکل مدیریت حافظه کمک میکند، از جمله:
- Memory/resource leaks
- Double free
- Use after free
هر مقدار در Rust دارای یک متغیر مرتبط به نام مالک آن است
به مثال زیر توجه کنید:
let s1 = String::from("Rust");
طبق قوانین مالکیت:
- s1 مالک دادههای ذخیره شدهی در heap است.
- هنگامیکه s1 از scope خارج شود، دادههای آن نیز پاک میشوند.
تلاش برای ارجاع به s1 پس از خارج شدن آن از scope، منجر به خطا میشود؛ زیرا مقدار آن از heap حذف شده و دیگر وجود ندارد.
اگر برای انتقال s1 به s2 از کد زیر استفاده کنید:
let s2 = s1;
Cloning Values
اگر بخواهیم بجای جابجایی مقدار، آن را تولید/نمونهسازی مجدد (cloning) کنیم، میتوانیم با فراخوانی متد ()clone اینکار را انجام دهیم:
let s2 = s1.clone();
Primitive Data و Cloning
در Rust، دادههای اولیه بهطور کامل در stack ذخیره میشوند و بهطور پیش فرض clone میشوند. نمونه سازی مجدد این انواع، ارزان است و تفاوتی بین clone و moving وجود ندارد.
پاس دادن Variables به Functions
ارسال یک متغیر به یک تابع، همان تأثیری را دارد که یک متغیر را به متغیر دیگری اختصاص میدهیم. به عنوان مثال، اگر s1 را به یک تابع ارسال کنیم، مالک جدید رشته p1 است ( p1 نام آرگومان تابع است). برای رفع هرگونه خطایی که ممکن است به این دلیل ایجاد شود، میتوانیم s1 را clone کرده و به تابع ارسال کنیم.
سیستم مالکیت Rust، یک راه قدرتمند را برای مدیریت حافظهی در زمان کامپایل فراهم میکند و از مشکلات رایج مرتبط با حافظه جلوگیری میکند. با درک و پیروی از قوانین مالکیت، میتوانید کد ایمنتر و کارآمدتری را در Rust بنویسید.