case ifadeleri ile bir programın akışını seçenek listesinden kontrol edebilirsin. Verse’teki case ifadesi, bir değeri birden çok olası değere karşı test etmenin (= kullanıyormuşsun gibi) ve hangisinin eşleştiğine bağlı olarak kodu çalıştırmanın bir yoludur.
case ifadeleri, oyuncu olmayan bir karakterin (NPC) olduğu oyunlar gibi her türlü uygulamada kullanılabilir.
Örneğin, devriye seçeneği etkinleştirilmiş bir muhafız çıkarmak için Muhafız Çıkma Yeri cihazını kullandığını varsayalım. Muhafız oyuna çıktıktan sonra, Boşta, Devriye, Tetikte, Saldırı ve Toplama gibi birkaç olası aktif duruma sahiptir. Bununla ilgili ayrıntılı bir durum geçiş diyagramı şöyle görünebilir:
Bu durum geçişlerini oyun içinde gözlemleyebilirsin.
Bu videoda varsayılan davranış olarak muhafızın devriye seçeneği etkinleştirilmiştir.
Videoda muhafız, bilim üssünde devriye gezmekteyken kaynak toplamaya geçiş yapmaktadır. Sonrasında muhafız oyuncuyu tespit eder ve bunun sonucunda önce bir uyarı durumuna (üzerine gelindiğinde görünen soru işaretiyle belirtilir), ardından da saldırı durumuna (üzerine gelindiğinde görünen ünlem işaretiyle belirtilir) geçer.
Muhafız, içinde bulunduğu duruma bağlı olarak belirli davranışlar sergileyecek olup bu davranışlar genellikle programın belirli bir durum girmeyi seçmesi halinde çağrılan fonksiyonlar olarak kodlanır.
Bu üst düzey muhafız durumu geçişi, kod halinde şu şekilde görünebilir:
case(GuardStateVariable):
idle_state =>
RunIdleAnimation()
SearchPlayerCharacter()
harvest_state =>
GatherResources()
alert_state=>
RunAlertAnimation()
PlayAlertSound()
DisplayAlertUIElement()
Bu case ifadesi, programa muhafız belirli bir duruma girdiğinde hangi fonksiyonların çalıştırılacağını söyleyen bir etiket iletir.
Bu ifadede, muhafızın patrol_state durumu varsayılan durumdur çünkü devriyesi etkinleştirilmiş bir muhafız, varsayılan devriye davranışını çalıştırmalıdır.
Bu, sözdizimsel olarak şununla aynıdır:
expression0
case (test-arg-block):
label1 =>
expression1
label2 =>
expression2
_ =>
expression3 for the default case
expression4case blokundaki label1 ve label2 gibi her desenin sabit => blok biçimini kullanması gerekir. Buradaki sabit bir tamsayı, mantık, dize, char veya enum sabiti olabilir. Dolayısıyla case ifadeleri yalnızca int, logic, string, char ve enum’lar ile çalışır.
Yapı
Verse case ifadesi yapısal olarak GuardStateVariable test bağımsız değişken bloğunun girdisini temel alarak kod çalıştırır ve işlevsel olarak bir dizi if ifadesi ile aynı şekilde çalışır.
Bu örnekte GuardStateVariable alert_state olarak çözümlenirse Verse programı expression3 çalıştırır. Program patrol_state içinde geçerse Verse yapısal olarak varsayılan case’e atlayarak expression5 çalıştırır.
Case İfadesini Başka Bir Kontrol Akışıyla Kullanma
Bir case ifadesindeki blokların, case ifadesinin bir loop içinde olması halinde kesilmesine ve devam etmesine izin verilir. Case deyimi bloklarının da içinde bulundukları fonksiyondan geri dönmesine izin verilir.
Örneğin:
loop:
case (x):
42 => break
_ => {}Bu acayip döngü x = 42 durumunda hemen tamamlanacak veya sonsuza kadar devam edecektir.
Başka bir örnek:
Foo(x : int) : int =
case (x):
100 => return 200
_ => return 100Bu örnek şuna eşdeğerdir:
Foo(x : int) : int =
case (x):
100 => 200
_ => 100Bunun sebebi, case deyiminin işlevin son ifadesi olmasıdır.
Varsayılan Case
Bir _=> case’i (varsayılan bir case) olmayan case ifadeleri, case’lerin hiçbirinin eşleşmemesi halinde başarısız olacaktır. Bu gibi case deyimlerini başarısızlık bağlamlarında (decides efektli fonksiyonlar gibi) kullanmakta sorun yoktur.
Bir numaralandırmanın tüm case’leriyle eşleşen case ifadeleri, bir _=> case’i olmasa dahi başarısız olmaz.