Menu
Coddy logo textTech

Generic Metotlar

Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 25 / 61.

Jenerik bir yapı herhangi bir türü tutabilir, ancak verileriyle etkileşim kuracak yöntemler olmadan pek kullanışlı değildir. Jenerik bir yapı için yöntemler tanımlamak üzere impl bloğunda özel bir söz dizimine ihtiyacın vardır.

Önemli olan, genel parametreyi doğrudan impl üzerinde bildirmektir:

struct Wrapper<T> {
    value: T,
}

impl<T> Wrapper<T> {
    fn get(&self) -> &T {
        &self.value
    }
}

impl<T> ifadesinin Wrapper<T> ifadesinden önce geldiğine dikkat et. Bu, Rust'a T'nin tüm uygulama bloğu için genel bir tür parametresi olduğunu söyler. Bu bildirim olmadan Rust, T adlı somut bir tür arar ve onu bulamaz.

get yöntemi &T döndürür: sarmalayıcının tuttuğu tür neyse ona bir başvuru. Bu, T bir tamsayı, bir dize veya başka herhangi bir tür olduğunda çalışır:

let num_wrapper = Wrapper { value: 100 };
let text_wrapper = Wrapper { value: "Rust" };

println!("{}", num_wrapper.get());  // 100
println!("{}", text_wrapper.get()); // Rust

Aynı yöntem tanımı her ikisi için de çalışır, çünkü genel T, derleme zamanında her somut türe uyum sağlar.

challenge icon

Görev

Kolay

Genel kapsayıcınıza metotlar ekleyelim! Her türü tutabilen ve içeriğiyle etkileşim kurmak için metotlar sağlayan bir Box yapısı (Rust'ın standart Box yapısıyla karıştırılmamalıdır) oluşturacaksınız.

Kodunuzu iki dosyaya ayıracaksınız:

  • mybox.rs: MyBox<T> adında, türü contents olan özel bir alana sahip, T adlı genel bir yapı tanımlayın. Bu yapı için metotları uygulayın:
    • Verilen değerle yeni bir new oluşturan MyBox ilişkili işlevi
    • İçeriğe bir referans döndüren ( peek kullanarak) bir &self metodu
    • Yeni bir değer alan ve mevcut içeriğin yerine onu koyan ( replace kullanarak) bir &mut self metodu
  • main.rs: Modülünüzü içe aktarın ve farklı türlerle çalışan genel metotları gösterin. Kutular oluşturacak, içeriklerine bakacak ve metotların çalışmasını göstermek için değerleri değiştireceksiniz.

Genel bir yapı üzerinde metotları uygulamak için gereken temel sözdizimini unutmayın: Rust'a impl<T> türünün tüm uygulama bloğu için genel bir parametre olduğunu bildirmek amacıyla MyBox<T> ifadesinden önce T yazmanız gerekir.

Ana dosyanızda MyBox yapınızı şunları yaparak gösterin:

  1. Bir tamsayıyla ( i32 olarak ayrıştırılan ilk girdi) bir kutu oluşturma
  2. İçeriğine bakıp değeri yazdırma
  3. İçeriği yeni bir tamsayıyla ( i32 olarak ayrıştırılan ikinci girdi) değiştirme
  4. Güncellenen değeri göstermek için tekrar içeriğine bakma
  5. Bir dizeyle (üçüncü girdi) ikinci bir kutu oluşturma
  6. Dize kutusunun içeriğine bakma

Çıktınız şu biçimi izlemelidir:

Integer box contains: {value}
After replace: {value}
String box contains: {value}

Örneğin, 10, 25 ve Rust girdileriyle:

Integer box contains: 10
After replace: 25
String box contains: Rust

Üç girdi alacaksınız: bir başlangıç tamsayısı, bir değiştirme tamsayısı ve bir dize değeri.

Kendin dene

mod mybox;

use mybox::MyBox;

fn main() {
    // Girdileri oku
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let initial_int: i32 = input1.trim().parse().expect("Invalid integer");

    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let replacement_int: i32 = input2.trim().parse().expect("Invalid integer");

    let mut input3 = String::new();
    std::io::stdin().read_line(&mut input3).expect("Failed to read line");
    let string_value = input3.trim().to_string();

    // TODO: Başlangıç tamsayısıyla bir MyBox oluştur
    
    // TODO: Peek at its contents and print: "Integer box contains: {value}"
    
    // TODO: İçeriği değiştirme tamsayısıyla değiştir
    
    // TODO: Peek again and print: "After replace: {value}"
    
    // TODO: Dize değeriyle ikinci bir MyBox oluştur
    
    // TODO: Peek at the string box and print: "String box contains: {value}"
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Rust derleyicisi