Newtype Kalıbı
Güvenlik ve açıklık için türleri sarın.
Newtype Kalıbı, CoddyKit'te ücretsiz bir Learn Rust Coding dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Learn Rust Coding öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Learn Rust Coding kursu toplamda 4 dersten oluşur.
Newtype Nedir?
Newtype, mevcut bir türü sararak ona farklı bir kimlik kazandıran, tek alanlı bir demet yapısıdır. struct Meters(f64), yalnızca düz bir f64 tutmasına rağmen tamamen yeni bir türdür.
Sarmalayıcı çalışma zamanında hiçbir maliyet getirmez; ancak derleyicinin, ham bir ilkel türün ifade edemeyeceği anlamı zorunlu kılmasını sağlar.
struct Meters(f64);
struct Seconds(f64);Birimlerin Karıştırılmasını Önleme
Ham ilkel türleri birbiriyle karıştırmak kolaydır. Hem mesafe hem de zaman f64 ise bir çağrıda bunları yer değiştirmenizi engelleyen hiçbir şey yoktur.
Her birini kendi newtype'ı içinde sarmalamak, bu tür hataları sessiz bir hata yerine derleme hatasına dönüştürür.
fn speed(d: Meters, t: Seconds) -> f64 {
d.0 / t.0
}
// speed(Seconds(2.0), Meters(10.0)) -> compile errorİç Değere Erişme
Sarılmış değere demet dizini olan .0 üzerinden ulaşırsınız. Birçok newtype, kullanımı kolay dönüşümler için ayrıca bir yöntem sunar veya From uygular.
struct UserId(u64);
impl UserId {
fn value(&self) -> u64 { self.0 }
}
fn main() {
let id = UserId(42);
println!("id = {}", id.value());
}Değişmez Koşulları Kapsülleme
İç alanı gizli yapın ve bir oluşturucuda doğrulayın. Böylece newtype'ın her değerinin geçerli olması garanti edilir ve onu kullanan kodun yeniden denetim yapması gerekmez.
pub struct Email(String);
impl Email {
pub fn new(s: &str) -> Option<Email> {
if s.contains('@') {
Some(Email(s.to_string()))
} else {
None
}
}
}Yetim Kuralı
Rust, yabancı bir özellik için yabancı bir tür üzerinde uygulama yazılmasını yasaklar. impl Display for Vec<T> yazamazsınız; çünkü ne özelliğin ne de türün sahibi sizsiniz.
Bu kural, kasalar arasındaki özellik tutarlılığını güvenli tutar; ancak yararlı uygulamaları engelleyebilir.
Newtype'lar Yetim Kuralını Aşar
Newtype kendi kasanızda tanımlandığı için artık yerel bir türün sahibisiniz ve onun için istediğiniz özelliği uygulayabilirsiniz. Bu, yetim kuralını aşmanın standart yoludur.
use std::fmt;
struct Wrapper(Vec<String>);
impl fmt::Display for Wrapper {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "[{}]", self.0.join(", "))
}
}Çalıştırılabilir Bir Wrapper Display
Burada önceki sahnedeki sarmalayıcı kullanıma alınır. Wrapper'ın sahibi biz olduğumuz için onun için Display uygulamak serbesttir ve program birleştirilmiş listeyi yazdırır.
use std::fmt;
struct Wrapper(Vec<String>);
impl fmt::Display for Wrapper {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "[{}]", self.0.join(", "))
}
}
fn main() {
let w = Wrapper(vec!["a".into(), "b".into()]);
println!("{}", w);
}API Yüzeyini Sınırlama
Güçlü bir türü sarmalamak, yalnızca güvenli bir alt kümesini sunmanızı sağlar. Bir NonEmptyVec, boşalmasına yol açabilecek değiştirici yöntemleri gizleyerek değişmez koşulunu koruyabilir.
pub struct NonEmptyVec<T>(Vec<T>);
impl<T> NonEmptyVec<T> {
pub fn new(first: T) -> Self {
NonEmptyVec(vec![first])
}
pub fn first(&self) -> &T {
&self.0[0]
}
}Sıfır Maliyetli Soyutlama
Tek alanlı bir newtype, sarılan değerle aynı bellek düzenine sahiptir. Derleyici sarmalayıcıyı ortadan kaldırır; dolayısıyla buradaki güvenlik çalışma zamanında gerçekten ücretsizdir.
#[repr(transparent)] eklemek, FFI için önemli olan özdeş bellek düzenini garanti eder.
#[repr(transparent)]
struct Celsius(f64);Newtype'larda Özellik Türetme
Newtype'lar, uygun durumlarda iç değer gibi davranabilmek için çoğu zaman standart özellikleri türetir. Türetme, anahtarlar, karşılaştırmalar ve hata ayıklama çıktısı için kullanımı kolay korur.
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
struct ProductId(u32);
fn main() {
let a = ProductId(7);
let b = a.clone();
println!("{:?} == {:?}: {}", a, b, a == b);
}Newtype ile Tür Takma Adı Arasındaki Fark
Newtype'ı tür takma adıyla karıştırmayın. type Meters = f64 yalnızca bir addır; hâlâ bir f64'tür ve ek güvenlik sağlamaz.
struct Meters(f64) biçimindeki newtype, derleyicinin ayrı tutabileceği gerçekten farklı bir türdür.
type Km = f64; // alias: interchangeable with f64
struct Mi(f64); // newtype: distinct from f64Hızlı Kontrol
Bir newtype'ın, tür takma adının sağlayamadığı yararı neden sağladığını belirleyin.
Özet
Newtype kalıbı, farklı bir kimlik kazanmak için mevcut bir türü tek alanlı bir demet yapısında sarar; bunu çalışma zamanında hiçbir maliyet olmadan yapar. Değerlerin karıştırılmasını önler, değişmez koşulları gizli bir alanın arkasında kapsüller ve yabancı özellikleri uygulayabilmeniz için yetim kuralını aşar.
Tür takma adının aksine newtype gerçek ve ayrı bir türdür.
Sıkça Sorulan Sorular
“Newtype Kalıbı” dersi ücretsiz mi?
Evet — “Newtype Kalıbı” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Learn Rust Coding kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Learn Rust Coding kursu toplamda 4 dersten oluşur.
“Newtype Kalıbı” dersinde ne öğreneceğim?
Güvenlik ve açıklık için türleri sarın. Learn Rust Coding ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Learn Rust Coding öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Learn Rust Coding, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Newtype Kalıbı” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Learn Rust Coding dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Learn Rust Coding dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.