159 lines
3.5 KiB
Markdown
159 lines
3.5 KiB
Markdown
---
|
|||
|
|
baslik: Sayılabilir türler
|
||
|
|
bolum: Kendi türlerin
|
||
|
|
ozet: sayilabilir ile sınırlı seçenekleri güvenle tutmak
|
||
|
|
---
|
||
|
|
|
||
|
|
Bir siparişin durumu "hazırlanıyor", "kargoda" ya da "teslim edildi" olabilir; başka bir şey olamaz. Bunu metinle tutarsan bir gün biri `"kargda"` yazar ve hata gözden kaçar. `sayilabilir`, bir değişkenin alabileceği değerleri baştan sayar; yanlış yazılan bir değer program çalışmadan yakalanır.
|
||
|
|
|
||
|
|
## Tanımlamak ve kullanmak
|
||
|
|
|
||
|
|
Her üye kendi satırına yazılır. Üyeye `Tur.UYE` diye ulaşırsın.
|
||
|
|
|
||
|
|
```kbl
|
||
|
|
sayilabilir Durum:
|
||
|
|
HAZIRLANIYOR
|
||
|
|
KARGODA
|
||
|
|
TESLIM_EDILDI
|
||
|
|
|
||
|
|
siparis = Durum.KARGODA
|
||
|
|
yazdir(siparis)
|
||
|
|
eger siparis == Durum.KARGODA:
|
||
|
|
yazdir("Siparişin yolda.")
|
||
|
|
```
|
||
|
|
```cikti
|
||
|
|
KARGODA
|
||
|
|
Siparişin yolda.
|
||
|
|
```
|
||
|
|
|
||
|
|
Yazdırınca üyenin adı görünür.
|
||
|
|
|
||
|
|
## Yanlış üye derlenmez
|
||
|
|
|
||
|
|
```kbl goster
|
||
|
|
sayilabilir Renk:
|
||
|
|
KIRMIZI
|
||
|
|
MAVI
|
||
|
|
|
||
|
|
r = Renk.MOR # derleme hatası: Renk'in MOR diye bir üyesi yok
|
||
|
|
```
|
||
|
|
|
||
|
|
Bu, sayılabilir türlerin asıl yararıdır: yazım hatası programın çalıştığı ana değil, derlendiği ana yakalanır.
|
||
|
|
|
||
|
|
## Seçeneğe göre karar vermek
|
||
|
|
|
||
|
|
Sayılabilir değerler `eger / degilse eger` ile çok iyi anlaşır. Bir trafik ışığının sıradaki rengini bulalım.
|
||
|
|
|
||
|
|
```kbl
|
||
|
|
sayilabilir Isik:
|
||
|
|
KIRMIZI
|
||
|
|
SARI
|
||
|
|
YESIL
|
||
|
|
|
||
|
|
fonksiyon sonraki(i: Isik) -> Isik:
|
||
|
|
eger i == Isik.KIRMIZI:
|
||
|
|
don Isik.YESIL
|
||
|
|
degilse eger i == Isik.YESIL:
|
||
|
|
don Isik.SARI
|
||
|
|
don Isik.KIRMIZI
|
||
|
|
|
||
|
|
isik = Isik.KIRMIZI
|
||
|
|
dongu adim icinde 1..4:
|
||
|
|
yazdir(isik)
|
||
|
|
isik = sonraki(isik)
|
||
|
|
```
|
||
|
|
```cikti
|
||
|
|
KIRMIZI
|
||
|
|
YESIL
|
||
|
|
SARI
|
||
|
|
KIRMIZI
|
||
|
|
```
|
||
|
|
|
||
|
|
## Üyelerin sayı değerleri
|
||
|
|
|
||
|
|
Her üyenin arkasında bir sayı vardır. İlk üye 0'dan başlar; istersen değeri kendin verirsin. Değer yazılmayan üye bir öncekinden devam eder. `sayi()` ile bu değeri alırsın.
|
||
|
|
|
||
|
|
```kbl
|
||
|
|
sayilabilir Oncelik:
|
||
|
|
DUSUK = 1
|
||
|
|
ORTA
|
||
|
|
YUKSEK = 10
|
||
|
|
|
||
|
|
yazdir(sayi(Oncelik.DUSUK))
|
||
|
|
yazdir(sayi(Oncelik.ORTA))
|
||
|
|
yazdir(sayi(Oncelik.YUKSEK))
|
||
|
|
yazdir(Oncelik.YUKSEK > Oncelik.ORTA)
|
||
|
|
```
|
||
|
|
```cikti
|
||
|
|
1
|
||
|
|
2
|
||
|
|
10
|
||
|
|
doğru
|
||
|
|
```
|
||
|
|
|
||
|
|
## Yapı alanı ve liste öğesi olarak
|
||
|
|
|
||
|
|
Sayılabilir bir değer yapının alanı ya da listenin öğesi olabilir.
|
||
|
|
|
||
|
|
```kbl
|
||
|
|
sayilabilir Tur:
|
||
|
|
KEDI
|
||
|
|
KOPEK
|
||
|
|
KUS
|
||
|
|
|
||
|
|
yapi Hayvan:
|
||
|
|
ad = ""
|
||
|
|
tur = Tur.KEDI
|
||
|
|
|
||
|
|
barinak = [Hayvan("Pamuk", Tur.KEDI), Hayvan("Karabaş", Tur.KOPEK), Hayvan("Maviş", Tur.KUS), Hayvan("Tekir", Tur.KEDI)]
|
||
|
|
kedi_sayisi = 0
|
||
|
|
dongu h icinde barinak:
|
||
|
|
yazdir(f"{h.ad:<8}{h.tur}")
|
||
|
|
eger h.tur == Tur.KEDI:
|
||
|
|
kedi_sayisi += 1
|
||
|
|
yazdir(f"{kedi_sayisi} kedi var.")
|
||
|
|
```
|
||
|
|
```cikti
|
||
|
|
Pamuk KEDI
|
||
|
|
Karabaş KOPEK
|
||
|
|
Maviş KUS
|
||
|
|
Tekir KEDI
|
||
|
|
2 kedi var.
|
||
|
|
```
|
||
|
|
|
||
|
|
> **Dikkat:** Sözlük değerleri sayılabilir tutamaz: `{"a": Tur.KEDI}` derlenmez. Böyle bir eşleme gerekiyorsa değeri bir yapının alanında tut.
|
||
|
|
|
||
|
|
## Alıştırma
|
||
|
|
|
||
|
|
```alistirma
|
||
|
|
`Mevsim` adında `ILKBAHAR`, `YAZ`, `SONBAHAR`, `KIS` üyeli bir sayılabilir tür tanımla. `mevsim_bul(ay: sayi) -> Mevsim` fonksiyonu ay numarasına göre mevsimi döndürsün (12, 1, 2 kış; 3-5 ilkbahar; 6-8 yaz; 9-11 sonbahar). Verilen aylar için sonucu yazdır.
|
||
|
|
%%%
|
||
|
|
# buraya yaz
|
||
|
|
|
||
|
|
dongu ay icinde [1, 4, 7, 10]:
|
||
|
|
yazdir(mevsim_bul(ay))
|
||
|
|
%%%
|
||
|
|
sayilabilir Mevsim:
|
||
|
|
ILKBAHAR
|
||
|
|
YAZ
|
||
|
|
SONBAHAR
|
||
|
|
KIS
|
||
|
|
|
||
|
|
fonksiyon mevsim_bul(ay: sayi) -> Mevsim:
|
||
|
|
eger ay >= 3 ve ay <= 5:
|
||
|
|
don Mevsim.ILKBAHAR
|
||
|
|
degilse eger ay >= 6 ve ay <= 8:
|
||
|
|
don Mevsim.YAZ
|
||
|
|
degilse eger ay >= 9 ve ay <= 11:
|
||
|
|
don Mevsim.SONBAHAR
|
||
|
|
don Mevsim.KIS
|
||
|
|
|
||
|
|
dongu ay icinde [1, 4, 7, 10]:
|
||
|
|
yazdir(mevsim_bul(ay))
|
||
|
|
%%%
|
||
|
|
KIS
|
||
|
|
ILKBAHAR
|
||
|
|
YAZ
|
||
|
|
SONBAHAR
|
||
|
|
```
|