Gerçek hayattaki uygulamalarda çoğu zaman, bir değerle bağlanmış değişkenleri işlevlere iletmek veya bunları diğer değişkenlerin bağlanması amacıyla o değişkene atamak zorunda kalıyoruz. Bir değerin mülkiyetini üstlenmeden işlem yapmak gerektiğinde, o değerin sahibi olan orijinal değişken bağlamına bir başvuru yapılır.
Borçlanma Bu kavram dilimizde: Bir şeyi iade etme garantisi verilerek ödünç almak anlamına gelir.
⭐️ Rust'ta iki tür borçlanmadan bahsedebiliriz:
-
Paylaşılan Borçlanma
(&T)
- Bir veri parçası içeriği değiştirilmemek kaydıyla, bir ya da çok kullanıcı tarafından ödünç alınabilir.
-
Değişken Borçlanma
(&mut T)
- Bir veri parçası, tek bir kullanıcı tarafından ödünç alınabilir ve değiştirilebilir, ancak bu durumda o verilere başkaları erişemez ve kullanamaz.
Borçlanmanın oldukça önemli kuralları bulunmaktadır:
-
Bir veri parçası belli bir anda; ya paylaşılan ya da değişken borçlanma şeklinde ödünç alınabilir. Ancak ikisi de aynı anda olamaz.
-
Borçlanma hem kopyalanan hem de taşınan türleri kapsar.
-
Canlılık kavramı ↴
fn main() {
let mut a = vec![1,2,3];
let b = &mut a; // 'a' nın değişken borçlanması yani `&mut` burada başlar
// :
// :
// Bazı kodlar // :
// Bazı kodlar // :
} // &mut değişken borçlanma burada sona erer.
fn main() {
let mut a = vec![1,2,3];
let b = &mut a; // 'a' nın değişken borçlanması &mut burada başlar
// Bazı kodlar // :
println!("{:?}", a); // paylaşılan borç olarak verilen 'a'ya erişmeye
// çalışmak derleyicinin hata vermesine neden olur.
} // &mut değişken borçlanma burada sona erer.
fn main() {
let mut a = vec![1,2,3];
{
let b = &mut a; // 'a' nın değişken borçlanması &mut burada başlar
// Bazı kodlar // :
} // &mut değişken borçlanma burada sona erer.
println!("{:?}", a); // burada 'a' nın paylaşılan borçlanmasına izin verilir
}
Yukarıdaki bahsi geçen paylaşılan ve değişken borçlanmaların nasıl kullanılacağını aşağıdaki örneklerde inceleyelim.
Örnek 1:
fn main() {
let a: [u8; 3] = [1,2,3];
let b = &a;
println!("a: {:?}, b[0]: {}", a, b[0]);
}
// a: [1, 2, 3], b[0]: 1
Örnek 2:
fn ilk_ogeyi_getir(a: &Vec<u8>) -> u8 {
a[0]
}
fn main() {
let a: Vec<u8> = vec![1,2,3];
let b = ilk_ogeyi_getir(&a);
println!("a: {:?}, b: {:?}", a, b);
}
// a: [1, 2, 3], b: 1
Örnek 1:
fn main() {
let mut a = [1, 2, 3];
let b = &mut a;
b[0] = 4;
println!("{:?}", b);
}
// [4, 2, 3]
Örnek 2:
fn main() {
let mut a = [1, 2, 3];
{
let b = &mut a;
b[0] = 4;
}
println!("a:{:?}", a);
}
// [4, 2, 3]
Örnek 3:
fn ilk_ogeyi_degistir_ve_getir(a: &mut Vec<i32>) -> i32 {
a[0] = 4;
a[0]
}
fn main() {
let mut a = vec![1, 2, 3];
let b = ilk_ogeyi_degistir_ve_getir(&mut a);
println!("a:{:?}, b:{:?}", a, b);
}
// a:[4, 2, 3], b:4