ProgramlamaRust Geliştirici / Backend Geliştirici

Rust'ta yapıcılar ve fabrika yöntemleri nedir (örn. new, with_capacity), nasıl doğru bir şekilde uygulanır ve yeni başlayanların karşılaştığı yaygın hatalar nelerdir?

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

Cevap.

Rust, C++/Java gibi özel yapıcılar içermez. Genellikle yapıcı, ilişkili bir fonksiyon olarak uygulanır (örn. new). Önemli özellikler:

  • İlişkili fonksiyon, traitler veya nesne ile ilişkilendirilmemiştir, :: ile çağrılır.
  • Hem self hem de Result<Self, E> döndürebilir — hatalı yapıcılar için kullanışlıdır.
  • Farklı fabrikalar (with_capacity, from_str, özel varyantlar) uygulanabilir.

Temel bir yapıcı örneği:

struct Point { x: i32, y: i32 } impl Point { pub fn new(x: i32, y: i32) -> Self { Point { x, y } } }

Hatalı yapıcı örneği:

impl Point { pub fn try_new(x: i32, y: i32) -> Result<Self, String> { if x < 0 || y < 0 { Err("Koordinatlar negatif olamaz".to_string()) } else { Ok(Point { x, y }) } } }

Aldatıcı soru.

Yapıcı için hangi tür fonksiyon kullanılması gerekir: normal fonksiyon, yöntem veya ilişkili fonksiyon, ve neden?

Birçok kişi "yöntem" olarak yanıtlıyor. Ancak Rust'ta yapıcılar — yalnızca ilişkili fonksiyonlardır (self olmadan), çünkü henüz bir örnek yoktur ve normal bir yöntemi çağırmak mümkün değildir.

struct Foo; impl Foo { // ilişkili fonksiyon, yöntem değil pub fn new() -> Self { Foo } }

Konuyla ilgili bilgilerin eksikliğinden kaynaklanan gerçek hata örnekleri.


Hikaye

Bir programcı yapıcıyı bir yöntem olarak uyguladı:

impl Point { pub fn make(&self, x: i32, y: i32) -> Self { ... } }

Bu mantıksız ve kafa karıştırıcıdır: bir nesne oluşturmak için henüz var olmayan bir nesne gerekir! Geliştirici, bu yöntemi nasıl çağıracağını bulmakta zorlandı. Statik bir fonksiyon şeklinde düzeltildi.


Hikaye

Klasik hata: hatalı yapıcı için Option<Self> döndürmek, bu nedenle zincirleme hataların atlanması. Result<Self, E> döndürdükten sonra, hataları daha açık bir şekilde iletmek mümkün oldu.


Hikaye

from_parts, from_str gibi fabrikaların From/FromStr trait'i kullanılmadan uygulanması. Sonuç olarak, standart dönüşüm mekanizmaları çalışmadı (örn. str.parse::<MyType>()). Hata keşfedildikten sonra FromStr entegre edildi ve kodun ekosistem kütüphaneleri ile uyumluluğu artırıldı.