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:
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:
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:
pub fn notify<T: Summary>(item: &T) {
println!("Notification: {}", item.summarize());
}Alternatif olarak, daha karmaşık imzalar için where yan tümcesini kullanabiliriz:
pub fn notify_advanced<T>(item: &T)
where
T: Summary
{
println!("Notification: {}", item.summarize());
}Kendin dene
Alıştırma 1: Özet Özelliği
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.
İ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ı
Ö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.
İ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
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).
İ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