ProgramlamaBackend Geliştirici

Rust'ta 'tip takma' (type alias) nasıl uygulanır, bunlar yeni tiplerden (newtype pattern) ne şekilde farklıdır ve API tasarlarken bu farkı anlamak neden önemlidir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Rust'ta mevcut bir tür için takma ad (alias) oluşturmak için type yapısını kullanabilirsiniz. Örneğin:

type Kilometre = i32; fn mesafe_ekle(x: Kilometre, y: Kilometre) -> Kilometre { x + y }

Kilometre, i32 için sadece başka bir isimdir; derleyici bu türleri ayırmaz ve tamamen birbiriyle değiştirilebilirler.

Newtype pattern ise mevcut bir tür için yeni bir sarıcı yapı oluşturmaktır:

struct Kilometre(i32); // ayrı yeni bir tür fn mesafe_ekle(x: Kilometre, y: Kilometre) -> Kilometre { Kilometre(x.0 + y.0) }

Artık Kilometre ve i32 farklı türlerdir, karıştırılamazlar.

  • Takma adlar okunabilirliği veya genel API'leri kolaylaştırır.
  • Newtype deseni tip güvenliğini sağlar ve yeni türler için benzersiz trait'ler uygulamanıza izin verir.

Bu yaklaşımlar arasında seçim, güvenlik ve okunabilirlik gereksinimlerine bağlıdır. Açık API'ler ve özellikle tip güvenli ölçü birimleri için newtype kullanın.

Aldatıcı soru.

Rust'taki type takma adı ile newtype pattern arasındaki fark nedir? Tip takma adına trait uygulaması ile işlemleri kısıtlamak mümkün mü?

Çoğu zaman, takma adın erişim kontrolü ve işlem kısıtlamaları için kullanılabileceği söylenir, ancak bu doğru değildir; çünkü takma ad yeni bir tür oluşturmaz, bu nedenle onun için benzersiz trait'ler uygulanamaz. Sadece newtype pattern - ayrı bir türdür ve onun için benzersiz davranışlar uygulamak mümkündür.

type KullaniciId = u64; struct KullaniciIdYeni(u64); trait Foo { fn foo(&self); } // KullaniciId için Foo'yu uygulamak mümkün değildir, çünkü bu sadece u64’tür. // KullaniciIdYeni için ise mümkündür.

Konuyla ilgili terimlerin bilinmemesinden kaynaklanan gerçek hata örnekleri.


Hikaye

Bir projede, takma adlar kullanarak mesafeleri metre ve milimetre cinsinden ölçtüler:

type Milimetre = u32; type Metre = u32;

Son kodda, yanlışlıkla milimetreleri metrelerle topladılar, bu da hesaplama hatalarına yol açtı. Tip kontrolü işe yaramadı - derleyici bunu yakalayamadı. Newtype'a geçildi ve sorun ortadan kalktı.


Hikaye

Açık bir API'de, farklı varlıkların tanımlayıcıları için takma adlar kullandılar (type KullaniciId = u64;, type SiparisId = u64;). Karışıklık oluştu: biri parametreleri yer değiştirdi ve hata, tipler aracılığıyla ayırt edilemediği için üretime düştü.


Hikaye

Bir geliştirici, tip takma adına Display trait'i için benzersiz bir davranış uygulamaya çalıştı:

type BenimTipim = String; impl Display for BenimTipim { ... }

Derleyici hata verdi: "trait'i tip takma adı için uygulamak mümkün değildir". Sorun newtype pattern ile çözüldü.