Zig'de Optionals (Seçimli Değerler)
Zig programlama dilinde bir fonksiyonun döndürebileceği sonuçlar genellikle iki farklı yapı üzerinden ele alınır:
- Error Union: Bir hata (error) veya değer (value) döndüren yapılar →
!
operatörüyle ifade edilir. (Bkz: [[error-union-in-zig | error union]]) - Optional: Bir değer (value) veya hiçlik (null) döndüren yapılar →
?
operatörüyle ifade edilir.
Bu makalede ikinci yapıyı, yani Optionals kavramını inceleyeceğiz.
Optionals Nedir?
Bir değişkenin belirli bir değere sahip olup olmadığını temsil etmek için kullanılır. Eğer değer varsa ilgili türün bir değeri döner, yoksa null
döner.
var foo: ?u32 = 10;
Bu örnekte foo
değişkeni iki farklı durumda olabilir:
- Bir
u32
değeri (örnekte10
), null
.
?T
ifadesi, "T türünde bir değer veya null" anlamına gelir.
Optionals ile Kontrol Yapıları
Optional değerlerle çalışırken, değer mevcut mu değil mi sorusunu yanıtlamak için kontrol blokları kullanılır. Örneğin:
const std = @import("std");
pub fn main() void {
var x: ?i32 = null;
x = 42;
if (x) |val| {
std.debug.print("Value: {}\n", .{val});
} else {
std.debug.print("No value\n", .{});
}
}
Burada kullanılan yapı:
if (x) |val| { ... } else { ... }
- Eğer
x
null değilse,val
üzerinden değer alınır. - Eğer
x
null ise,else
bloğu çalışır.
- Eğer
Zig'de Optionals Kontrol Yöntemleri
Zig'de Optionals ile çalışırken sık kullanılan yöntemler şunlardır:
if (opt) |val| { ... }
→ Değer varsaval
içerisine alınır.if (opt == null)
→ Null olup olmadığını kontrol eder.opt.?
→ Değer yoksa panic oluşturur, varsa değeri döndürür.opt orelse <default>
→ Null ise varsayılan değer döndürür.
null
, bir değerin mevcut olmadığını ifade eder. Bellekte bu alan ayrılmış ama içi boş bırakılmıştır.
orelse
ile Varsayılan Değer Kullanımı
orelse
ifadesi, null kontrolü yapmadan bir varsayılan değer döndürmek için kullanılır.
// hayali fonksiyon
const result: ?u8 = GetValue();
// Eğer result null ise 42 atanır, değilse result'un değeri kullanılır
const my_answer: u8 = result orelse 42;
Bu yapı, sık kullanılan "fallback" mantığını Zig dilinde oldukça sade bir şekilde ifade eder.
.?
Operatörü
Eğer bir Optional değerin kesinlikle null olmayacağını biliyorsak, .?
operatörüyle doğrudan değere erişebiliriz.
const x: ?i32 = 100;
const y: i32 = x.?; // null ise panic atar
Bu kullanım dikkatli yapılmalıdır. Çünkü değer
null
çıkarsa program panic ile sonlanır.
Sonuç ve Değerlendirme
Zig dilinde Optionals yapısı, belirsiz değerleri kontrol etmenin güçlü bir yolunu sunar. Hem güvenli hem de açık bir sözdizimine sahiptir. Kullanım senaryoları:
- Veritabanı sorguları: Kayıt bulunabilir ya da bulunamayabilir.
- API çağrıları: Beklenen alan eksik olabilir.
- Konfigürasyon değerleri: Varsayılan atama yapılması gerekebilir.
Özetle:
if (opt) |val| {}
→ Güvenli değer alma,orelse
→ Varsayılan değer,.?
→ Kesin değer beklentisi (null değilse),== null
→ Null kontrolü.
Bu yapılarla, Zig programlarındaki "boş değer" yönetimi hem okunabilir hem de güvenli hale gelir.