Veri Varyantlarını Eşleme
Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 16 / 61.
Önceki derste, farklı varyantları ele almak için enum metotlarının içinde match kullandın. Şimdi match ifadesinin bu varyantların içinde depolanan verileri gerçekte nasıl çıkardığına odaklanalım: destructuring adı verilen bir teknik.
Veri içeren bir enum varyantıyla eşleştirme yaptığınızda, bu verileri doğrudan desen içinde değişkenlere bağlayabilirsiniz:
enum Event {
Click { x: i32, y: i32 },
KeyPress(char),
Resize(u32, u32),
}
fn handle_event(event: Event) {
match event {
Event::Click { x, y } => {
println!("Clicked at ({}, {})", x, y);
}
Event::KeyPress(key) => {
println!("Key pressed: {}", key);
}
Event::Resize(width, height) => {
println!("Resized to {}x{}", width, height);
}
}
}
Her kol, varyantın yapısına göre verileri farklı şekilde çıkarır. Yapı benzeri varyantlar için adlandırılmış alanları çekmek üzere { field_name } kullanırsın. Demet varyantları için (width, height) gibi konumsal değişkenler kullanırsın.
Seçtiğin değişken adları, o match kolunun içinde kullanılabilir hâle gelir. Bu güçlüdür çünkü hangi varyanta sahip olduğunu aynı anda kontrol eder ve onun veri yüküne erişim kazanırsın.
Görev
KolayFarklı türlerdeki kullanıcı komutlarını işleyen bir komut işlemcisi oluşturalım. Her komut farklı veriler taşır ve işlemciniz bu verileri çıkarmak ve uygun yanıtlar üretmek için desen eşleştirmeyi kullanır.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
command.rs: Üç varyanta sahip genel birCommandenum'u tanımlayın:Say: tek birStringmesajı taşır (demet sözdizimi)Move: adlandırılmış alanlar taşır:direction(String) vesteps(u32)Calculate: toplanacak sayıları temsil eden ikii32değeri taşır (demet sözdizimi)
executedöndürmek içinmatchkullanan birStringyöntemi uygulayın.main.rs: Komut modülünü dahil edin, sağlanan girdileri kullanarak her komut varyantından bir örnek oluşturun ve sonuçları yazdırmak için her biri üzerindeexecuteyöntemini çağırın.
execute yönteminiz, verilerine erişmek için her varyantın içeriğini ayrıştırmalı ve şu tam biçimlerde mesajlar döndürmelidir:
Sayiçin:Saying: {message}Moveiçin:Moving {steps} steps {direction}Calculateiçin:{a} + {b} = {sum}
Çıktınız, her komutun sonucunu kendi satırında göstermelidir:
Saying: {message}
Moving {steps} steps {direction}
{a} + {b} = {sum}Örneğin, "Hello world" mesajına sahip bir say komutu, 5 adımlık "north" yönünde bir hareket ve 10 ile 25 değerlerinin hesaplanması durumunda çıktı şöyle olur:
Saying: Hello world
Moving 5 steps north
10 + 25 = 35Beş girdi alacaksınız: say mesajı, yön, adım sayısı ve hesaplanacak iki sayı.
Kendin dene
mod command;
use command::Command;
fn main() {
// Girdileri oku
let mut say_message = String::new();
std::io::stdin().read_line(&mut say_message).expect("Failed to read line");
let say_message = say_message.trim().to_string();
let mut direction = String::new();
std::io::stdin().read_line(&mut direction).expect("Failed to read line");
let direction = direction.trim().to_string();
let mut steps_input = String::new();
std::io::stdin().read_line(&mut steps_input).expect("Failed to read line");
let steps: u32 = steps_input.trim().parse().expect("Failed to parse steps");
let mut num1_input = String::new();
std::io::stdin().read_line(&mut num1_input).expect("Failed to read line");
let num1: i32 = num1_input.trim().parse().expect("Failed to parse num1");
let mut num2_input = String::new();
std::io::stdin().read_line(&mut num2_input).expect("Failed to read line");
let num2: i32 = num2_input.trim().parse().expect("Failed to parse num2");
// TODO: say_message kullanarak bir Say komutu oluştur ve çalıştır
// TODO: direction ve steps kullanarak bir Move komutu oluştur ve çalıştır
// TODO: num1 ve num2 kullanarak bir Calculate komutu oluştur ve çalıştır
// TODO: Her komut çalıştırmasının sonuçlarını yazdır
}
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