Çoklu Generic Türler
Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 26 / 61.
Bazen tek bir genel parametre yeterli değildir. Ya iki değer tutan ve bu değerlerin farklı türlerde olabileceği bir yapıya ihtiyacın varsa? Rust, birden fazla genel parametreyi virgüllerle ayırarak kullanmana olanak tanır.
İşte potansiyel olarak farklı türlerde iki değer tutan bir Pair yapısı:
struct Pair<T, U> {
first: T,
second: U,
}
<T, U> iki bağımsız tür parametresi bildirir. T ve U aynı tür olabilir veya tamamen farklı türler olabilir: bir örnek oluştururken seçim sana aittir:
let both_ints = Pair { first: 10, second: 20 }; // T=i32, U=i32
let mixed = Pair { first: "hello", second: 3.14 }; // T=&str, U=f64
let reversed = Pair { first: 100, second: "world" }; // T=i32, U=&str
Yöntemleri uygularken tüm genel parametreleri impl bloğunda bildirirsin:
impl<T, U> Pair<T, U> {
fn get_first(&self) -> &T {
&self.first
}
fn get_second(&self) -> &U {
&self.second
}
}
Bu kalıp, key-value çifti, farklı sayısal türlerde koordinatlar veya metadata ile eşleştirilmiş bir sonuç gibi, birbiriyle ilişkili ancak potansiyel olarak farklı iki veri parçasını ilişkilendirmeniz gerektiğinde yaygındır.
Görev
KolayBirden fazla genel türün gücünü gösteren bir anahtar-değer depolama sistemi oluşturalım! Herhangi iki türü eşleştirebilen bir KeyValue yapısı oluşturacaksınız; bu yapı etiketleri verilerle, kimlikleri nesnelerle veya başka herhangi bir kombinasyonu ilişkilendirmek için mükemmeldir.
Kodunuzu iki dosyada düzenleyeceksiniz:
keyvalue.rs: İki özel alana sahip,KeyValue<K, V>adlı genel bir yapı tanımlayın:keytüründeKvevaluetüründeV. Bu yapıyla çalışmak için yöntemler uygulayın:- Bir anahtar ve değerden
newoluşturanKeyValueilişkili işlevi - Anahtara bir başvuru döndüren
keyyöntemi - Değere bir başvuru döndüren
valueyöntemi - Geçerli değeri yeni bir değerle değiştiren
set_valueyöntemi
- Bir anahtar ve değerden
main.rs: Modülünüzü dahil edin ve aynı yapı tanımının farklı tür kombinasyonlarıyla nasıl çalıştığını gösterin. Birden fazla genel türün esnekliğini göstermek için farklı türlerde anahtar-değer çiftleri oluşturacaksınız.
Ana dosyanızda aşağıdaki anahtar-değer çiftlerini oluşturun ve bunlarla çalışın:
- Dize anahtarlı ve tamsayı değerli bir çift (ilk girdi anahtar, ikinci girdi
i32olarak ayrıştırılan değer) - Anahtarı ve değeri yazdırın
- Değeri yeni bir tamsayıyla güncelleyin (üçüncü girdi
i32olarak ayrıştırılır) - Güncellenmiş değeri yazdırın
- Tamsayı anahtarlı ve dize değerli ikinci bir çift oluşturun (dördüncü girdi anahtar olarak
i32şeklinde ayrıştırılır, beşinci girdi değer olarak kullanılır) - Bu çiftin anahtarını ve değerini yazdırın
Çıktınız şu biçimi izlemelidir:
Key: {key}, Value: {value}
Updated value: {value}
Key: {key}, Value: {value}Örneğin, girdiler name, 42, 100, 7 ve lucky olduğunda:
Key: name, Value: 42
Updated value: 100
Key: 7, Value: luckyİlk çiftin KeyValue<String, i32> kullandığına, ikinci çiftin ise KeyValue<i32, String> kullandığına dikkat edin: aynı yapı, farklı tür kombinasyonları!
Beş girdi alacaksınız: bir dize anahtar, bir tamsayı değer, bir değiştirme tamsayısı, bir tamsayı anahtar ve bir dize değer.
Kendin dene
mod keyvalue;
use keyvalue::KeyValue;
fn main() {
// Beş girdi oku
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let string_key = input1.trim().to_string();
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let int_value: i32 = input2.trim().parse().expect("Failed to parse");
let mut input3 = String::new();
std::io::stdin().read_line(&mut input3).expect("Failed to read line");
let replacement_int: i32 = input3.trim().parse().expect("Failed to parse");
let mut input4 = String::new();
std::io::stdin().read_line(&mut input4).expect("Failed to read line");
let int_key: i32 = input4.trim().parse().expect("Failed to parse");
let mut input5 = String::new();
std::io::stdin().read_line(&mut input5).expect("Failed to read line");
let string_value = input5.trim().to_string();
// TODO: string_key ve int_value kullanarak bir KeyValue<String, i32> çifti oluştur
// TODO: Anahtarı ve değeri şu formatta yazdır: "Key: {key}, Value: {value}"
// TODO: set_value kullanarak değeri replacement_int ile güncelle
// TODO: Print the updated value in format: "Updated value: {value}"
// TODO: int_key ve string_value kullanarak bir KeyValue<i32, String> çifti oluştur
// TODO: Bu çiftin anahtarını ve değerini şu formatta yazdır: "Key: {key}, Value: {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