بیاموزید که چگونه می توانید از این نوع داده سفارشی برای بهبود ساختار برنامه های Rust خود استفاده کنید.
یکی از ویژگی های کلیدی که Rust را قدرتمندتر و جذاب تر می کند، پشتیبانی آن از ساختارها است. ساختارها انواع داده های ترکیبی برای گروه بندی داده های مرتبط هستند. آنها به شما امکان می دهند انواع داده های سفارشی را با فیلدهای نامگذاری شده تعریف کنید که سازماندهی کد را بهبود می بخشد و دستکاری داده ها را آسان تر می کند.
شما می توانید از ساختارها برای نمایش اشیاء مختلف، از جمله انواع داده ها و پیکربندی های تعریف شده توسط کاربر استفاده کنید. ساختارها نسبت به بسیاری دیگر از ساختارهای داده انعطاف پذیرتر هستند. توانایی آنها در محصور کردن داده های مرتبط آنها را مفید می کند زیرا آنها مدل منطقی تری از اشیاء دنیای واقعی ایجاد می کنند.
تعریف سازه ها و فیلدهای سازه
شما یک ساختار را با استفاده از کلمه کلیدی struct و به دنبال آن نامی برای ساختار تعریف خواهید کرد. این را با مشخص کردن نام فیلدهای ساختار و انواع دادههای Rust آنها در داخل یک جفت بریس فرفری دنبال کنید.
struct Person {
name: String,
age: u8,
is_student: bool,
}
این ساختار Person دارای سه فیلد است. فیلد نام یک رشته، فیلد age یک عدد صحیح 8 بیتی بدون علامت و فیلد is_student یک بولی است.
می توانید از Structure literals برای ایجاد نمونه های struct بعد از تعریف struct استفاده کنید. لفظ Struct مقادیر فیلدهای یک ساختار را مشخص می کند.
let person = Person {
name: String::from("John"),
age: 27,
is_student: true,
};
متغیر person نمونه ای از ساختار Person است که با یک ساختار تحت اللفظی ایجاد شده است. این تحت اللفظی تمام فیلدهای ساختار را با مقادیر نوع داده مربوط به آنها نمونه می کند.
استفاده از سازنده ها برای ایجاد سازه ها
شما همچنین می توانید از یک تابع سازنده برای ایجاد یک نمونه از یک ساختار استفاده کنید.
impl Person {
// Define a constructor function `new` that takes `name`, `age` and
// `is_student` parameters
fn new(name: String, age: u8, is_student: bool) -> Self {
// Create a new instance of `Person` struct and initialize its fields
// with the provided values
Self {
name,
age,
is_student,
}
}
}
// Call the `new` constructor function of the `Person` struct and assign the
// resulting instance to `person`
let person = Person::new(String::from("John"), 27, true);
برنامه بالا یک سازنده برای ساختار Person با کلمه کلیدی impl تعریف می کند. سازنده جدید فیلدهای struct را به عنوان آرگومان می گیرد و نمونه جدیدی از ساختار را با مقادیر اولیه برمی گرداند.
می توانید با سازنده جدید یک نمونه Person ایجاد کنید و آرگومان های مناسب را برای آن ارسال کنید.
دسترسی و اصلاح فیلدهای ساختار
شما می توانید با استفاده از نماد نقطه به فیلدهای ساختار دسترسی داشته باشید و آنها را تغییر دهید. شما به سادگی از عملگر نقطه (.) و به دنبال آن نام فیلد برای دسترسی یا تغییر مقدار آن استفاده کنید.
// declare a Person struct
struct Person {
name: String,
age: u8,
is_student: bool,
}
fn main() {
// instantiate a struct
let mut person = Person {
name: String::from("John"),
age: 27,
is_student: true,
};
// print the name and age fields of the struct
println!("Name: {}", person.name);
println!("Age: {}", person.age);
// modifiy the is_student field
person.is_student = false;
println!("Is student: {}", person.is_student);
}
این برنامه یک ساختار ایجاد می کند، ساختار را نمونه سازی می کند، نام و فیلدهای سن را چاپ می کند و فیلد is_student را قبل از چاپ فیلد تغییر می دهد.
اعلام روش ها برای سازه ها
برخلاف ساختارهای C، میتوانید روشهایی را روی ساختارهای Rust تعریف کنید که روی یک نمونه کار میکنند. متدها توابعی هستند که برای دسترسی و اصلاح به یک ساختار ارجاع می دهند. همچنین می توانید از نماد نقطه برای فراخوانی متدهای یک ساختار و دسترسی به عملکرد آنها استفاده کنید.
در اینجا نحوه تعریف متدها برای ساختارها و استفاده از آن روش ها برای انجام عملیات آمده است:
struct Person {
name: String,
age: u8,
is_student: bool,
}
impl Person {
fn say_hello(&self) {
println!("Hello, my name is {} and I'm {} years old.", self.name,
self.age);
}
fn have_birthday(&mut self) {
self.age += 1;
}
}
fn main() {
let mut person = Person {
name: String::from("John"),
age: 27,
is_student: true,
};
person.say_hello();
person.have_birthday();
println!("New age: {}", person.age);
}
برنامه دو روش برای ساختار Person تعریف می کند. روش say_hello به خود اشاره می کند و تبریکی را چاپ می کند که شامل نام و سن فرد است. روش have_birthday یک ارجاع قابل تغییر به خود می گیرد و سن فرد را افزایش می دهد.
مدل مالکیت Rust مدیریت حافظه را بهینه می کند
ساختارها ساختارهای داده همه کاره هستند که به عنوان نوعی معادل کلاس حداقل عمل می کنند.
مانند سایر ساختارهای داده Rust، هنگام کار با متغیرهای ساختاری باید از قوانین مالکیت Rust پیروی کنید. مدل مالکیت تضمین می کند که شما حافظه را به طور موثر در برنامه های خود مدیریت می کنید و از مشکلات رایج مانند نشانگرهای پوچ و آویزان جلوگیری می کند.