gokayburuc

Rust - Type Aliasing

Rust'ta Tip Takma Adları (Type Aliasing): Aynı Temel Tipin Farklı Yüzleri

Giriş

Rust'ın tip sistemi, derleme zamanı güvenliğinin temelini oluşturur. Ancak bazen aynı temel tipi, farklı anlamlar ifade etmek için kullanmak gerekir. Rust bunun çözümü olarak tip takma adı (type alias) mekanizmasını sunar. Bu makale, tip takma adlarının ne olduğunu, nasıl çalıştığını ve kritik bir tasarımları olan "güvenlik garantisi taşımama" özelliğini örnek bir kod üzerinden incelemektedir.

Tip Takma Adı Nedir?

Tip takma adı, mevcut bir tipin yeni bir isimle eşlenmesidir. type anahtar kelimesiyle tanımlanır:

type NanoSecond = u64;
type Inch = u64;
type U64 = u64;

Bu tanımlar derleyiciye şunu söyler: "NanoSecond dediğimde aslında u64 kastediyorum." Takma adlar yeni bir tip oluşturmaz; yalnızca okunabilirliği artıran isimlerdir.

Örnek Kodun İncelenmesi

// Suffix type names are updated as the list given below
type NanoSecond = u64;
type Inch = u64;
type U64 = u64;

pub fn execute_aliasing() {
    let nanoseconds: NanoSecond = 5 as u64;
    let inches: Inch = 2 as U64;

    println!(
        "{} nano seconds + {} inches = {} unit?",
        nanoseconds,
        inches,
        nanoseconds + inches
    );
}

Çıktı

5 nano seconds + 2 inches = 7 unit?

Adım Adım Analiz

  1. Takma ad tanımları: NanoSecond, Inch ve U64 üçü de u64'e eşlenmiştir. Üçü de derleyici gözünde aynı tip olan u64'ün farklı isimleridir.

  2. as dönüşümleri: 5 as u64 ifadesi bir i32 literalsini u64'e dönüştürür. Dikkat çekici olan, 2 as U64 ifadesinin de geçerli olmasıdır. Bu, U64'ün gerçekten u64'ün takma adı olduğunu kanıtlar: takma ad, as dönüşümünde temel tipin yerine geçebilir.

  3. Anlamsız toplama: nanoseconds + inches ifadesi derlenir ve çalışır. Nanosaniye ile inç toplamak fiziksel olarak anlamsızdır, ancak Rust buna itiraz etmez.

Kritik Nokta: Takma Ad Yeni Tip Değildir

Bu örneğin merkezindeki ders şudur: tip takma adları, tip güvenliği sağlamaz. Yukarıdaki kodda NanoSecond ve Inch farklı kavramlar gibi görünse de, derleyici için her ikisi de yalnızca u64'tür. Bu nedenle:

Newtype desenini kullanan bir karşılaştırma durumu netleştirir:

struct NanoSecond(u64);
struct Inch(u64);

fn main() {
    let ns = NanoSecond(5);
    let inch = Inch(2);
    // let sum = ns + inch; // HATA: expected `NanoSecond`, found `Inch`
}

Tuple yapısı (newtype) gerçek, ayrı bir tip oluşturur. Derleyici nanosaniye ile inçi toplamayı reddeder. Bu, birim karışıklığının önlenmesi gerektiğinde yeni tip deseni kullanılması gerektiği anlamına gelir.

Tip Takma Adlarının Doğru Kullanım Alanları

Takma adların değerli olduğu bağlamlar:

Sonuç

Tip takma adları Rust'ta okunabilirliği artıran, uzun tipleri kısaltan ve kodun niyetini belirten hafif bir araçtır. Ancak yeni tip oluşturmadıkları için tip güvenliği sağlamazlar: aynı temele eşlenmiş takma adlar birbirleriyle serbestçe karışabilir. Farklı birimlerin karıştırılmasını derleme zamanında engellemek isteyen geliştiriciler, newtip desenine (struct NanoSecond(u64);) başvurmalıdır. Kıstas şudur: niyeti anlatmak için takma ad, güvenliği zorlamak için yeni tip.

#rust