زبان برنامه نویسی برای طراحی وب
همانطوری که می بینید طراحی سایت خودرو کامپایلر به ما نادرست برمیگرداند. یعنی مشکلی که داشتیم حل شد. اکنون slice ما به مقدار مهم سنجاق شدهاست و ما نمیتوانیم مقدار مهمرا تا هنگامی که slice دارای اعتبار میباشد تغییر و تحول بدهیم.
این خلق کامپایلر سبب ساز میگردد که شما دیگر خطاها رایجی را مانند آنچه در اولِ نوشته توضیح داده شد نکنید.
امّا اینجانب بایستی در کُدم کمی که پیش از اینً از آن یک slice گرفتهام را تغییر و تحول بدهم
هم اکنون شاید قوانینی پیشبیاید که شما بخواهید متغیّریرا که پیش از اینً یک slice از آن گرفتهاید تغییر و تحول بدهید. مثل کاری که بالاکردیم.
راستش پیش از اینکه این عمل را بکنید در آغاز یک توشه به معماری و قضیهتان فکرکنید. به احتمال زیاد اختلال از طریقی برخوردتان با مورد میباشد و شما نباید چنین کاری بکنید. امّا در صورتیکه به هر هم اکنون مایحتاج بود چنین کاری بکنید، ما اینجا دو منش داریم:
1-به کار گیری از scope
به عبارتیطوری که تا قبل از اینً درمورد scopeها دیدیم (در حالتیکه یادتان وجود ندارد روی این لینک و پیوند کلیک فرمایید و خیلی سریع تمامیچیز را بهخیال و خاطر بیاورید) میتوانیم قسمت به چنگ آوردن slice را باطن یک scope دیگر تعریف و تمجیدکنیم و تغییرو تحول collection را بعد از انتها این scope انجام بدهیم.
برای اینکه بهتر متوجّه حرفم بشوید، بیایید کد تحت را با هم ببینیم:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
fn main() {
let mut my_array = [-5, -3, -10, 0, 1, 8, 9];
{ // New scope for slicing my_array
let not_negative_item = first_not_negative_element(&my_array);
if not_negative_item.len() == 1 {
println!(\"First not negative element in the my_array is: {:?}\", not_negative_item);
} else {
println!(\"All elements of my_array are negative.\");
}
} // End of the scope
my_array = [5i32; 7];
println!(\"New first not negative value: {:?}\", first_not_negative_element(&my_array));
}
fn first_not_negative_element(array: &[i32; 7]) -> &[i32] {
for (index, &item) in array.iter().enumerate() {
if item > -1 {
return &array[index..index + 1];
}
}
return &array[0..array.len()];
}
به عبارتیطوری که می بینید ما پس از تعریفوتمجید متغیّر my_array باطن تابع main، یک scope نو را باطن آن تابع آغاز کردهایم و باطن آن با استعمال از تابع first_not_negative_element یک slice از آن آرایهرا گرفتهایم و پرینتش کردهایم.
هم اکنون بعداز آخر scope و باطن به عبارتی تابع main، مقدار متغیّر my_array را عوض کردهایم و مجدد مثل پیشین یک slice از آن گرفتهایم.
خب بیایید ببینیم خروجی این کد چه میگردد:
1
2
First not negative element in the my_array is: [0]
New first not negative value: : [5]
این توشه نرمافزار سوای هیچ مشکلی اجرا شد. زیرا زمانی که از scope پیشین بیرون میشویم دیگر slice قبل که در not_negative_item ذخیرهگردیده بود نیست. پس دیگر با تغییر و تحول دادهی مهم مشکلی هم پیش نخواهد آمد.
2-نسخه برداری کن
طرز دیگر، که ولی سبب ساز ساخت و ساز سربار یاد میشود، نسخه برداری کردن collection میباشد. یعنی از دادهای که پیش از اینً از آن یک slice گرفتهایم نسخه برداری می گیریم و در یک متغیّر نو میریزیم. درحال حاضر این متغیّر تازه را تغییرو تحول میدهیم.
از جملهً اپی تحت را ملاحظه کنید:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fn main() {
let my_array = [-5, -3, -10, 0, 1, 8, 9];
let not_negative_item = first_not_negative_element(&my_array);
if not_negative_item.len() == 1 {
println!(\"First not negative element in the my_array is: {:?}\", not_negative_item);
} else {
println!(\"All elements of my_array are negative.\");
}
let mut my_second_array = my_array; // copying my_array to new variable
my_second_array[0] = 100;
println!(\"New first not negative value: {:?}\", first_not_negative_element(&my_second_array));
}
fn first_not_negative_element(array: &[i32; 7]) -> &[i32] {
for (index, &item) in array.iter().enumerate() {
if item > -1 {
return &array[index..index + 1];
}
}
return &array[0..array.len()];
}
اینجا ما یک متغیّر نو به اسم my_second_array تعریفوتمجید کرده ایم. حال ویّلین عنصر این آرایهرا عوض کردهایم و به عبارتی فعالیت نمونه قبل را برای به دست آوردن یک slice از آن و نمایشش کردهایم.
درصورتیکه این نرمافزاررا اجرا کنیم خروجی ذیل را از آن می گیریم:
1
2
First not negative element in the my_array is: [0]
New first not negative value: [100]
از این طریق خیلی با احتیاط استعمال نمایید. این شیوه سربار خاطر ساخت مینماید، زیرا ما مجدد داریم به عبارتی دادهی گذشته را باطن یاد محافظت می کنیم. این ممکن میباشد اپلیکیشنی شما را بهخیال استعمالی بیشتراز حد از یاد مبتلا خلل نماید.
نکته: همانطوری که دیدید ما درین نمونه برخلاف پیشینها متغیّر ویّل را immutable کردیم (با برداشتن کلمه و واژهی mut از تعریفوتمجید آن). برهان این عمل این میباشد که متغیّر ابتدایی هیچ زمان تغییر تحول نمینماید و چیزی که بایستی مدام بهخاطرش داشته باشید این میباشد که مدام در قابل انعطافافزارتان بایستی حدّاقل دادهی mutable ممکنرا داشته باشید.
سودگیری
ادغام طلایی مالکیّت (Ownership)، borrowing و slicing سبب می شود که شما از ایمنی خاطر مطمئن باشید. با امداد اینها از 99? مشکلاتی که نرم افزارنویسهای سیستمی با گویشهایی مثل c دارا هستند ریلکس می شوید.
هنوز فعالیت ما با slicing کل نشده میباشد. از جملهً stingهای عادی hardcode گردیدهای که تا قبل از اینً چشم بودیم همه slice میباشند. امّا گفت و گو slicing را در همینجا کل می کنیم. باقی مباحث مرتبط با slicing را در نصیبهای دیگر درمیان مباحث دیگر می بینیم تا ریلکسخیس درکشان کنیم.
در شرایطی که سؤالی درمورد هر قسمت این مباحث داشتید یا این که بخشی به نظرتان به اندازهی کافی روشن نبود، از روش قسمت ایده ها یا این که آدرس اینترنتی منرا مطلع فرمایید.