Ana içeriğe geç
Modül 5 · Ders 2 ders 2Kurstaki 10/14~15 min
Modül dersleri (2/2)

Özellikler ve Özellik Sınırları

Özellikler belirli bir türün sahip olduğu ve diğer türlerle paylaşabileceği davranışı tanımlar. Diğer programlama dillerindeki arayüzlere benzer şekilde, belirli bir ortak işlevselliği veya arayüzü temsil eden bir dizi yöntemi tanımlamak için özellikleri kullanabiliriz.

Özellik sınırları, genel bir türün belirli bir özelliği uygulaması gerektiğini belirtmemize olanak tanıyarak gerekli yöntemlerin derleme zamanında kullanılabilir olmasını sağlar.


Bir Özelliğin Tanımlanması ve Uygulanması

Bir özelliği tanımlamak için trait anahtar sözcüğünü ve ardından uygulama türlerinin tanımlaması gereken yöntemlerin imzalarını kullanırız:

Rust
pub trait Summary {
    fn summarize(&self) -> String;
}

Bir özelliği somut bir türe uygulamak için impl TraitName for TypeName sözdizimini kullanırız:

Rust
pub struct NewsArticle {
    pub headline: String,
    pub content: String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}", self.headline)
    }
}

Özellik Sınırları

Genel işlevler yazarken, tür parametrelerini belirli bir özelliği uyguladıklarından emin olmak için sınırlayabiliriz. Standart sözdizimi <T: Trait> şeklindedir:

Rust
pub fn notify<T: Summary>(item: &T) {
    println!("Notification: {}", item.summarize());
}

Alternatif olarak, daha karmaşık imzalar için where yan tümcesini kullanabiliriz:

Rust
pub fn notify_advanced<T>(item: &T)
where
    T: Summary
{
    println!("Notification: {}", item.summarize());
}

Kendin dene

Alıştırma 1: Özet Özelliği

Egzersiz#rust.m5.l2.e1
Denemeler: 0Yükleniyor…

fn Summary(&self) -> String; yöntem imzasını içeren Özet adlı bir özellik tanımlayın. Daha sonra, String türünde bir başlık alanına sahip bir NewsArticle yapısı tanımlayın ve özetleme yönteminin başlık alanının değerini döndürmesi için bunun Özet özelliğini uygulayın.

Düzenleyici yükleniyor…
İpucu göster

'Özet' özelliğini ve 'Haber Makalesi' yapısını tanımlayın. NewsArticle için "impl Özeti" ile "self.headline.clone()" alanını klonlayarak uygulayın.

3 denemeden sonra çözüm mevcut

Alıştırma 2: print_summary ile Özellik Sınırları

Egzersiz#rust.m5.l2.e2
Denemeler: 0Yükleniyor…

Önceki alıştırmadaki kodu temel alarak, &T türünde bir parametre öğesini kabul eden print_summary<T> adında genel bir işlev tanımlayın. T'nin Özet özelliğini uygulaması gerekecek şekilde bir özellik sınırı uygulayın. Fonksiyonun içinde item.summarize() tarafından döndürülen sonucu yazdırın.

Düzenleyici yükleniyor…
İpucu göster

`fn print_summary<T: Summary>(item: &T)` imzasını kullanın ve`println!` içinde`item.summarize()``yı çağırın.

3 denemeden sonra çözüm mevcut

Alıştırma 3: Nitelikleri Kullanarak Alan Hesaplama

Egzersiz#rust.m5.l2.e3
Denemeler: 0Yükleniyor…

fn space(&self) -> f64; yöntemiyle Alan adlı bir özelliği tanımlayın. F64 türünde bir yarıçap alanı içeren bir yapı Çemberi oluşturun ve alanı hesaplayarak bunun için Alan özelliğini uygulayın (formül: yarıçap * yarıçap * 3.14159).

Düzenleyici yükleniyor…
İpucu göster

'Alan' özelliğini ve 'Çember' yapısını tanımlayın. Daire alanı formülünü kullanarak 'alan(&kendisi)'yi uygulayın.

3 denemeden sonra çözüm mevcut