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.
Görev
KolayGenel 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ücontentsolan özel bir alana sahip,Tadlı genel bir yapı tanımlayın. Bu yapı için metotları uygulayın:- Verilen değerle yeni bir
newoluşturanMyBoxilişkili işlevi - İçeriğe bir referans döndüren (
peekkullanarak) bir&selfmetodu - Yeni bir değer alan ve mevcut içeriğin yerine onu koyan (
replacekullanarak) bir&mut selfmetodu
- Verilen değerle yeni bir
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:
- Bir tamsayıyla (
i32olarak ayrıştırılan ilk girdi) bir kutu oluşturma - İçeriğine bakıp değeri yazdırma
- İçeriği yeni bir tamsayıyla (
i32olarak ayrıştırılan ikinci girdi) değiştirme - Güncellenen değeri göstermek için tekrar içeriğine bakma
- Bir dizeyle (üçüncü girdi) ikinci bir kutu oluşturma
- 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}"
}
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
1Metotlar ve Davranış
Uygulama Bloklarına GirişSelf ParametresiDeğiştirilebilir Metotlarİlişkili FonksiyonlarBirden Fazla Uygulama BloğuMetot ZincirlemeÖzet - Dikdörtgen Eylemleri4Proje: Sanal Evcil Hayvan
Evcil Hayvanı TanımlamaEvcil Hayvanı Besleme2Kapsülleme ve Modüller
Modül TemelleriPublic Anahtar KelimesiPrivate AlanlarGetter'larSetter'larÖzet - Güvenli Kasa5Generic Yapılar
Generic Struct'larGeneric MetotlarÇoklu Generic TürlerGeneric FonksiyonlarÖzet - Koordinat Noktası8Sınırlandırıcı Olarak Trait'ler
Trait Sınırlandırıcı SözdizimiÇoklu SınırlandırıcılarWhere CümleciğiTrait'ler ile Tip DöndürmeÖzet - Generic Yazıcı11Rust'ta Tasarım Kalıpları
Newtype KalıbıKompozisyonDrop Trait'iFrom ve IntoÖzet - Smart Pointer Mock3İleri Seviye Enum'lar
Veri İçeren Enum'larEnum MetotlarıVeri Varyantlarını EşlemeOption Enum'ına Yeniden BakışÖzet - Shape Enum6Trait Tanımlama
Trait Nedir?Traitleri UygulamaVarsayılan UygulamalarVarsayılanları Geçersiz KılmaParametreli TraitlerÖzet - Media PlayerKendi başına pratik yap: Online Rust derleyicisi