Rust, C++/Java gibi özel yapıcılar içermez. Genellikle yapıcı, ilişkili bir fonksiyon olarak uygulanır (örn. new). Önemli özellikler:
:: ile çağrılır.Result<Self, E> döndürebilir — hatalı yapıcılar için kullanışlıdır.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 }) } } }
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 } }
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_strgibi 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ı.