yoklateknik mülakat

Backend Rs Traits Generics Dispatch Mülakat Soruları

75 doğrulanmış Backend Rs Traits Generics Dispatch 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 Traits Generics DispatchZorluk 2
use std::fmt::Display;

fn label(flag: bool) -> impl Display {
    if flag { 1 } else { "one" }
}

fn main() {
    println!("{}", label(true));
}

Bu kod derlendiğinde ne olur?
  • aDerlenir ve 1 basar; her dal Display'e karşı kendi başına denetlenir.
  • bE0308: if ve else dalları, gizli tip için uyumsuz tipler taşır.
  • cE0277: &str Display implemente etmez, yalnız 1 dalı geçerlidir.
  • dDerlenir ve one basar; son ifade somut tipi sabitler.
Açıklama:Dönüş konumundaki impl Trait, fonksiyon gövdesinin seçtiği tek bir somut tipin opak takma adıdır. Burada bir dal i32, diğeri &str üretir; derleyici E0308 (if ve else uyumsuz tipler) verir. İki tip de Display implemente ettiğinden E0277 söz konusu değildir. Aynı arayüz arkasında farklı tipler döndürmek için Box<dyn Display> gerekir ve her dal kutulanır.
Rs Traits Generics DispatchZorluk 1
use std::fmt::Display;

fn show<T: Display>(t: T) -> String {
    format!("<{}>", t)
}

fn main() {
    println!("{}", show(vec![1, 2]));
}

Sonuç nedir?
  • aVec'in Debug çıktısıyla <[1, 2]> basar.
  • bE0308: Vec<i32> fonksiyonun beklediği T değildir.
  • cE0282: T bir vec! literalinden çıkarılamaz.
  • dE0277: Vec<{integer}> Display implemente etmez.
Açıklama:Generic bound'lar çağrı noktasında denetlenir. Vec<T> Debug implemente eder ama bilinçli olarak Display etmez (kanonik bir insan-okunur biçimi yoktur); bu yüzden show(vec![1, 2]) T: Display bound'unu ihlal eder ve rustc E0277 verir. T'nin kendisi sorunsuz çıkarılır (E0282 yok), tip uyuşmazlığı da yoktur (E0308 yok) — başarısız olan bound'dur.
Rs Traits Generics DispatchZorluk 2
trait Task {
    fn run(&self);
}

fn execute(t: dyn Task) {
    t.run();
}

Bu kod neden derlenmez?
  • aE0277: dyn Task'ın derleme-zamanı boyutu yoktur, & ya da Box arkasında durmalıdır.
  • bDerlenir; t.run() her trait-object çağrısı gibi vtable üzerinden gider.
  • cE0038: Task dyn-uyumlu değildir, çünkü run self yerine &self alır.
  • dE0308: bir trait parametre tipi olamaz, yalnız T: Task gibi bir bound olur.
Açıklama:dyn Task trait object'i unsized'dır: farklı implementor'lar farklı boyuttadır, dolayısıyla değer-parametresinin sabit bir stack boyutu yoktur. Fonksiyon parametreleri Sized olmalıdır, bu yüzden E0277. Trait object'ler daima bir işaretçi arkasında kullanılır (&dyn Task, Box<dyn Task>, Rc<dyn Task>). Task trait'i dyn-uyumludur — &self alıcısı tam da trait object'lerin istediği şeydir.
Rs Traits Generics DispatchZorluk 1
trait Greet {
    fn name(&self) -> String;
    fn hello(&self) -> String {
        format!("Hello, {}!", self.name())
    }
}
struct A;
impl Greet for A {
    fn name(&self) -> String { "A".into() }
}
struct B;
impl Greet for B {
    fn name(&self) -> String { "B".into() }
    fn hello(&self) -> String { "Hi B".into() }
}

fn main() {
    println!("{} | {}", A.hello(), B.hello());
}

Ne basılır?
  • aHello, A! | Hello, B!
  • bE0407: B hello'yu override edemez.
  • cHello, A! | Hi B
  • dE0046: A'da hello eksik.
Açıklama:Gövdesi olan trait metodu default metottur: implementor'lar onu atlayabilir (A gibi) ya da override edebilir (B gibi). Default hello, zorunlu name'i self üzerinden çağırır; A.hello() Hello, A! verir, B'nin override'ı Hi B döner. A'yı hello yazmaya zorlayan bir şey yoktur, B'nin onu değiştirmesini yasaklayan da.
Rs Traits Generics DispatchZorluk 1
struct Point { x: i32, y: i32 }

fn main() {
    let p = Point { x: 1, y: 2 };
    println!("{:?}", p);
}

Derleyici ne der?
  • aE0277: Point Debug implemente etmiyor; #[derive(Debug)] sorunu çözer.
  • bPoint { x: 1, y: 2 } basar; {:?} her struct'ta çalışır.
  • cE0599: Point için fmt metodu yok; p.fmt() açıkça çağrılır.
  • dE0308: {:?} bir String bekler, dolayısıyla önce p.to_string() gerekir.
Açıklama:{:?} Debug trait'ini gerektirir ve kullanıcı tanımlı tipler hiçbir formatlama trait'ini otomatik almaz. rustc E0277 (Point Debug implemente etmiyor) verir ve #[derive(Debug)] önerir; bu, Point { x: 1, y: 2 } basan bir impl üretir. Alan görünürlüğünün rolü yoktur; to_string() ise ayrı bir trait olan Display'i ister.
Rs Traits Generics DispatchZorluk 2
mod shapes {
    pub trait Area { fn area(&self) -> f64; }
    pub struct Sq(pub f64);
    impl Area for Sq {
        fn area(&self) -> f64 { self.0 * self.0 }
    }
}

fn main() {
    let s = shapes::Sq(2.0);
    println!("{}", s.area());
}

Ne olur?
  • a4 basar; impl Sq'nun yanında olduğundan metot tipin üzerinde her zaman görünür.
  • bE0603: Area shapes'e özeldir ve çağrılabilmesi için pub use gerekir.
  • cE0277: Sq, shapes modülünün dışında Area implemente etmez.
  • dE0599: Sq için area bulunamadı; trait use ile scope'a alınmalıdır.
Açıklama:Trait metotları yalnızca trait scope'tayken çağrılabilir. Impl mevcut ve Area pub, ama main onu import etmemiştir; metot çözümlemesi area'yı göremez ve rustc E0599 verir, trait item'larının ancak trait scope'tayken kullanılabileceği ipucunu ekler. Tek bir use shapes::Area; ile 4 basar. write_all'ı bir dosyada çağırmadan önce use std::io::Write; gerekmesinin sebebi de budur.

3750 soruluk Backend bankasında kendini sına.

Mülakata başla