Reference lar Rust da juda ham muhim ro’l o’ynaydi. Sababi Rust reference lardan xotiraga kirishni xavfsiz qilish uchun foydalanadi. Reference uchun albatta ‘&’ dan foydalanish kerak ekanligini oldingi maqolalarda ko’rib chiqdik.
fn main() {
let country = String::from("Austria");
let ref_one = &country;
let ref_two = &country;
println!("{}", ref_one);
}
Natija “Austria” bo’lib ko’rinadi.
Tepadagi kodda “country” o’zgaruvchisi “String” hisoblanadi. Lekin biz “country” uchun yana ikkita reference yaratdik, ularning ma’lumot turi esa “&String” ko’rinishida bo’ladi. Shu bilan birga biz hoxlagancha reference yaratsak bo’ladi va hech qanday muammo yuzaga kelmaydi.
Lekin muammoli holatlar ham bor :
fn return_str() -> &str {
let country = String::from("Austria");
let country_ref = &country;
country_ref // ⚠️
}
fn main() {
let country = return_str();
}
“return_str()” funksiyamiz bizga “String” yaratib beradi va keyin esa bu “string”ga reference ham yaratadi. Albatta funksiya oxirida esa bu qiymatni qaytarishga harakat qiladi. Lekin, “country” o’zgaruvchisi faqatgina funksiyaning ichdagina yashaydi, funksiyadagi amallar bajarib bo’linishi bilan esa xotiradan o’chirib yuboriladi. Shundan kelib chiqib ayta olamizki, bizdagi “country_ref” qiymat mavjud bo’lmagan xotira adresiga bog’lab qo’yilganday bo’lib qoladi va bu yaxshi emas. Rust da buning oldini olish uchun maxsus usullari bor.
Bulardan “owned” ya’ni egalik qilish turi haqida esa keyingi postimizdan ko’rib chiqamiz.Sababi, agar sizdagi qiymatga o’zingiz egalik qilsangiz. Bu qiymatga egalikni boshqa o’zgaruvchiga ham berishingiz mumkin albatta, lekin sizda faqatgina reference bo’lsa unda buni iloji yo’q va sizdagi reference qiymat qachonki haqiqiy qiymat yo’q bo’lsa hech qanday qiymatga ega bo’lmay qoladi.
Leave a Reply