Rust’un en güçlü özelliklerinden biri, match ifadesi aracılığıyla gerçekleştirilen desen eşleştirmedir. Rust 1.26 sürümüyle birlikte "match ergonomics" terimi ortaya çıktı — bu, eşleştirme ifadeleri içindeki referans değerlerin açılması ve otomatik dereferans alma üzerine yeni bir mantık geliştirdi ve bu da ref ve *'ın açıkça kullanılma sayısını azaltmayı hedefliyordu.
Match ergonomics'ten önce, referansı saran bir enum kullanılırken (örneğin, Option<&T>), desenin dereferans edilmesi gerektiğini açıkça belirtmek zorundaydınız:
let opt: Option<&i32> = Some(&10); match opt { Some(&val) => { /* ... */ }, None => {}, }
Bu durum, okunabilirliği azaltıyor ve karmaşık yapılardaki dereferanslama seviyelerinde hata yapma olasılığını artırıyordu.
Match ergonomics'in tanıtılmasıyla birlikte, Rust desenlerdeki referansları otomatik olarak dereferans alır; bu da daha basit ve doğal bir kod yazmayı mümkün kılar:
let opt: Option<&i32> = Some(&10); match opt { Some(val) => println!("{}", val), None => (), }
Derleyici, programcının kolaylığı için &i32'yi i32'ye dereferans alması gerektiğini "anlar". Bu işlev, Option, Result türleriyle ve bunların referanslarla kombinasyonlarıyla çalışmayı büyük ölçüde kolaylaştırır.
Anahtar özellikler:
* ve ref kullanımının azalmasıDesen içinde ref kullanımı ile değere referans (örneğin, ref val vs &val) arasındaki fark nedir?
ref, yığında bulunan bir değere referans oluşturur, oysa &val zaten mevcut olan bir referansla eşleşir. Bu, örneğin, değişkenlik ile çalışmak için ek bir referansa ihtiyaç duyduğunuzda önemlidir.
Örnek:
let x = 5; match x { ref r => println!("ref: {}", r), // r: &i32 }
Option<&T> içindeki desen eşleştirmede değişken bir referans kullanılırsa ne olur?
Otomatik dereferans alma, değişken referanslar için de çalışır. Option<&mut T>'niz olduğunda, match üzerinden değişken bir değeri doğrudan alabilirsiniz.
Örnek:
let mut x = 5; let opt = Some(&mut x); match opt { Some(val) => *val += 1, None => {} }
Match ergonomics, beklenmedik ödünç alma veya sahiplik hatalarına yol açabilir mi?
Evet, çünkü eşleme sırasında geçici bir ödünç alma (borrow) oluşturulduğunu fark etmiyorsanız, bu durumu belirli bir eşleme dalında işler ve bu değerle başka işlemleri engelleyebilir.
* ve ref kullanmak, kodun kısalığını ve okunabilirliğini azaltırYeni başlayan bir geliştirici, Some(&val) veya Some(ref val) gibi eski tarzı kullanmaya devam ederek, Rust'ı yeni bir sürüme güncellediğinde hata veya öngörülemeyen davranışlarla karşılaşır.
Artılar: Kod, Rust'ın eski sürümlerinde çalışır ve match ergonomics'ten önce eğitim alan kişiler için anlaşılırdır.
Eksiler: Düşük ifade gücü, derleyici güncellemelerinden sonra hata yapma riski.
Bir programcı, modern match ergonomics'i kullanarak, kodu kompakt ve otomatik dereferans almayı etkili bir şekilde kullanarak yazar.
Artılar: Kısa, okunması kolay, referans seviyeleriyle hata yapma riski daha az.
Eksiler: Eski Rust sürümleri için böyle bir kod uygun olmayabilir ve modern idiyomla az çalışmış olanlar için kafa karıştırıcı olabilir.