yoklateknik mülakat

Backend Rs Ownership Borrowing Lifetimes Mülakat Soruları

75 doğrulanmış Backend Rs Ownership Borrowing Lifetimes mülakat sorusu — cevaplarıyla çöz, açıklamalarıyla öğren, gerçek simülasyonda kendini test et.

Gerçek simülasyonu dene →

Örnek sorular

Rs Ownership Borrowing LifetimesZorluk 1
fn main() {
    let s = String::from("hi");
    let t = s;
    println!("{} {}", s, t);
}

Derleyici ne raporlar?
  • ahi hi basar; let t = s baytları t'ye kopyalar
  • bHata E0499: s ve t aynı heap tamponunun iki mutable sahibidir
  • cHata E0382: s, t'ye taşındı ve sonrasında kullanılıyor
  • dDerlenir, hi'yi bir kez basar; atamadan sonra s boşalır
Açıklama:String bir heap tamponuna sahiptir ve Copy değildir; let t = s sahipliği t'ye taşır. Derleyici sonraki s okumasını E0382 (borrow of moved value) ile reddeder. Hiçbir şey kopyalanmaz, s boşalmaz; sadece artık kullanılamaz.
Rs Ownership Borrowing LifetimesZorluk 1
fn main() {
    let a = 5;
    let b = a;
    println!("{} {}", a, b);
}

Ne olur?
  • aDerlenir ve 5 5 basar; i32 Copy'dir, b = a sonrası a geçerli kalır
  • bHata E0382; a, tıpkı bir String bağlaması gibi b'ye move edilir
  • c5 5 basar ama sadece derleyici sabiti katladığı için; runtime değeri move edilirdi
  • dHata E0502; println! bir ödünç daha isterken b, a'nın shared ödüncünü tutuyor
Açıklama:Tamsayı tipleri Copy uygular; atama bitleri kopyalar ve iki bağlama da kullanılabilir kalır. Değerin sabit ya da runtime'da hesaplanmış olması fark etmez; kural yalnızca tipe bağlıdır.
Rs Ownership Borrowing LifetimesZorluk 2
fn consume(s: String) -> usize {
    s.len()
}

fn main() {
    let s = String::from("hello");
    let n = consume(s);
    println!("{} {}", n, s);
}

Derleyici ne der ve callee string'i yalnızca okuyacaksa idiomatik düzeltme nedir?
  • a5 hello basar; argümanlar pointer kopyası olarak geçer, s'ye dokunulmaz
  • bE0505: consume, fonksiyon dönene kadar s üzerinde bir ödünç tutar
  • c5 hello basar; consume bitince sahiplik çağırana otomatik geri döner
  • dprintln!'de E0382; parametreyi &str yapıp consume(&s) çağır
Açıklama:String parametresi sahipliği alır; consume(s) s'yi move eder ve sonraki println! E0382 verir. Fonksiyon değeri döndürmedikçe sahiplik geri gelmez. Ödünç almak (&str ya da &String) çağıranın s'yi kullanmaya devam etmesini sağlar.
Rs Ownership Borrowing LifetimesZorluk 1
fn len(s: &String) -> usize {
    s.len()
}

fn main() {
    let s = String::from("hello");
    let n = len(&s);
    println!("{} {}", n, s);
}

Ne basılır?
  • aHiçbir şey; program println! satırında E0382 ile başarısız olur
  • bDerlenir ve 5 hello basar; &s string'i len'e yalnızca ödünç verir
  • c5 ve ardından panic; len dönünce ödünç bırakılır ve s serbest kalır
  • dBoş string ile 5 ; shared ödünç heap tamponunu geçici olarak taşır
Açıklama:&s geçirmek shared bir referans oluşturur; sahiplik main'den hiç çıkmaz. len dönünce ödünç biter ve s tamamen kullanılabilir. Değer ne taşınır ne serbest bırakılır.
Rs Ownership Borrowing LifetimesZorluk 2
fn add(s: &mut String) {
    s.push('!');
}

fn main() {
    let s = String::from("hi");
    add(&mut s);
    println!("{}", s);
}

Derleyici ne raporlar?
  • aE0499: add ve println! aynı anda s'nin mutable ödüncünü ister
  • bDerlenir ve hi! basar; bağlamayı mutable yapan çağrıdaki &mut'tır
  • cE0382: &mut s string'i add'e move eder, sonraki print taşınmış değeri kullanır
  • dE0596: s mutable ödünç alınamaz çünkü bağlama mut olarak bildirilmemiş
Açıklama:&mut s almak için s'nin kendisinin let mut ile bildirilmesi gerekir. Derleyici çağrıyı E0596 ile reddeder. Bildirime mut eklenince derlenir ve hi! basar; mutable ödünç değeri taşımaz.
Rs Ownership Borrowing LifetimesZorluk 2
fn main() {
    let mut s = String::from("hi");
    let a = &mut s;
    let b = &mut s;
    a.push('a');
    b.push('b');
    println!("{}", s);
}

Ne olur?
  • aE0499: a daha sonra hâlâ kullanılırken b, s'nin ikinci mutable ödüncüdür
  • bDerlenir ve hiab basar; art arda kullanıldıkları sürece iki &mut sorun değildir
  • cE0502: a ve b mutable ödünçken println! shared ödünç alır
  • dhib basar; ikinci &mut ilkinin yerini alır
Açıklama:Aynı anda yalnızca bir mutable ödünç canlı olabilir. b oluşturulduktan sonra a hâlâ kullanılıyor; yani let b = &mut s satırında ikisi de canlıdır ve derleyici E0499 verir. a.push('a') let b'den önce gelseydi ilk ödünç bitmiş olur ve kod derlenirdi.

3750 soruluk Backend bankasında kendini sına.

Mülakata başla