همانطوري که مي بينيد
اين خلق کامپايلر سبب ساز ميگردد که شما ديگر خطاها رايجي را مانند آنچه در اولِ نوشته توضيح داده شد نکنيد.
امّا اينجانب بايستي در کُدم کمي که پيش از اينً از آن يک 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
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[indexindex + 1];
}
}
return &array[0array.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
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[indexindex + 1];
}
}
return &array[0array.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 را در نصيبهاي ديگر درميان مباحث ديگر مي بينيم تا ريلکسخيس درکشان کنيم.
در شرايطي که سؤالي درمورد هر قسمت اين مباحث داشتيد يا اين که بخشي به نظرتان به اندازهي کافي روشن نبود، از روش قسمت ايده ها يا اين که آدرس اينترنتي منرا مطلع فرماييد.
نحوه راه اندازي سايت خودرو بدون برنامه نويسي
زبان برنامه نويسي مناسب براي طراحي وب
برنامه نويسي Back End چيست؟ مهارتها و زبانهاي لازم براي برنامه ن
array ,negative ,not ,my ,first ,slice ,not negative ,first not ,my array ,negative element ,negative item ,&array index index ,{return &array index ,{for index &item ,negative element array
درباره این سایت