استفاده از تکنیک struct update syntax در راست

سلام دوستان خسته نباشید
فرض کنید دو برادر داریم که می‌خوایم اطلاعات هردو رو داشته باشیم. برای این کار می تونیم یک استراکت داشته باشیم به این شکل:
29%20AM

چون این دو نفر برادر هستن از فیلدهای بالا فامیل و اسم پدر برای هردو مشترک و تکراری هست. پس می تونیم با تکنیک struct update فیلدهای تکراری رو بدون نوشتن مستقیم در استراکت دوم داشته باشیم.

حالا با این اوصاف من کد زیر رو نوشتم اما خطا تولید می کنه:

این هم از خطا:

مشکل از کجاست؟ :thinking:

std:string::String
عملکرد Copy را نداره
باید از clone استفاده کنید

5 Likes

پس مجبورم مستقیم اسم تک تک فیلدها رو تو استراکت دوم بنویسم و با کلونِ فیلدهای استراکت قبلی پر کنم :thinking:

مرسی داداش :pray:

نکته مهمی که باید بهش توجه کنید اینه که توی rust مقادیر استرینگ کپی نمیشه و در عوض، مالکیتشون منتقل میشه، برای مثال:

let a = String::from("Reza");
let b = a;

الان مالکیت مقدار استرینگ a به b منتقل شده و a دیگه مقداری نداره.

شما هم موقعی که my_brother رو تعریف میکنید، family و father_name رو از me منتقل میکنید به my_brother، پس me دیگه این دوتا مقدار رو داخل خودش نگه نمیداره.

اما راه حل، استفاده کردن از ویژگی یا خاصیت(trait) Clone هست، یعنی قبل از تعریف Struct خاصیت Clone رو براش فعال میکنیم و موقع آپدیت کردن هم متد clone() رو فراخوانی میکنیم، در اصل اعلام میکنیم که این struct مقادیرش قابل clone کردن هستند و کامپایلر عملیات لازم برای کپی کردن مقدار رو به عهده میگیره و انجام میده، عملا جلوی انتقال مالکیتشون رو میگیریم

#[derive(Clone)]
struct Person {
    name: String,
    family: String,
    age: u32,
    father_name: String
}
fn main() {
let me = Person {
    name: String::from("Reza"),
    family: String::from("Rahmani"),
    age: 30,
    father_name: String::from("Mohammad")
};

let my_brother = Person {
    name: String::from("Ali"),
    age: 18,
    ..me.clone()
}

کل تغییر مورد نیاز اضافه کردن خط اول و تغییر خط یکی مونده به آخر هست

1 Likes