“Defer” ifadesi, geçerli kapsamdan çıkana kadar kodun yürütülmesini geciktirir. Değişkenleri sıfırlamak gibi temizleme görevlerini yerine getirmek için “defer” ifadesini kullanabilirsin. Geçerli kapsamdan erken bir çıkış ("return" veya break gibi) olsa dahi, bir "defer" bloğundaki ifadeler "defer" ile karşılaşma çıkıştan önce olduğu sürece çalışmaya devam edecektir.
Aşağıdaki kod, “defer” bloğunu kullanarak bir değişkeni sıfırlamayı ve aynı zamanda aynı değişkeni return değeri olarak kullanmayı göstermektedir. Bu fonksiyonda, “RoundScore” döndürülür ve “defer” bloğundaki ifadeler hemen ardından çalıştırılır.
Bu da “RoundScore” değerini sıfırlanmadan önce kaydetmek için geçici bir değişken oluşturmanıza gerek olmadığı anlamına gelir.
OnRoundEnd<public>() : void =
var ScoreThisRound : int = AddRoundScoreToTotalScore()
Print("Bu turda kazanılan puanlar: {ScoreThisRound}")
<# RoundScore'u TotalScore'a ekler ve RoundScore'u sıfırlar.
Eklenen RoundScore değerini döndürür. #>
AddRoundScoreToTotalScore<public>() : int =
defer:
set RoundScore = 0
UpdateUI()
set TotalScore += RoundScore
return RoundScore
Defer İfadesinin Kullanımı
Bir “defer” ifadesini bir blok, döngü, for, if, branch veya başka bir “defer” gibi herhangi bir sıralı kod bloğu içinde kullanabilirsin.
Bir “defer” bloğu içindeki ifadeler bir istisna dışında hemen (asenk değil) olmalıdır. Asenk ifadeler, aşağıdakiler kullanılarak hemen yapılırsa, bir “defer” içinde kullanılmaya devam edilebilir:
- spawn
- “branch” (“defer”, eş yordam gibi bir asenk blok içindeyse).
Bir “defer” bir sonuç üretmez ve bir argüman veya atama değeri olarak kullanılamaz.
| defer | bir çıkıştan önce defer |
|---|---|
|
|
Büyütmek için görsele tıkla. |
Büyütmek için görsele tıkla. |
Bir “defer” ifadesi sadece bir erken çıkış gerçekleşmeden önce karşılaşılırsa yürütülür.
| erken dönüş ile defer | iptal edilen asenk bir ifade ile defer |
|---|---|
|
|
Büyütmek için görsele tıkla. |
Büyütmek için görsele tıkla. |
Aynı kapsamda görünen birden fazla defer ifadesi birikir. İfadelerin yürütüldüğü sıra, karşılaşıldığı sıranın tersidir: ilk giren son çıkar (FILO) sırası. Belirli bir kapsamda karşılaşılan son “defer” ifadesi önce yürütüldüğünden, bu son karşılaşılan “defer” içindeki ifadeler, daha önce karşılaşılan ve daha sonra yürütülen diğer “defer” ifadeleri tarafından temizlenecek içeriğe (değişkenler gibi) referans verebilir.
Verse kesin yıkım özelliğine sahip olmasa da “defer” kaynak temizliğini sağlamak için [RAII] benzeri bir davranışa izin verir.
| Bir kod bloğunda birden fazla defer ifadesi | Farklı kod bloklarında birden fazla defer ifadesi |
|---|---|
|
|
Büyütmek için görsele tıkla. |
Büyütmek için görsele tıkla. |
Çıkış, kontrolü “defer” kapsamı dışına aktarmadığı sürece bir “defer” bloğu içinde erken çıkışa izin verilir. Örneğin, bir “defer” içinde “break” içeren bir döngü kullanılmasına izin verilir ancak bu “break”, kod yürütmesini “defer” bloğu içinde tutmalıdır. “defer” bloğunun dışındaki bir “loop”a referans veremez.
Bir “defer” ifadesinin dış iç içe yerleştirme kapsamında karşılaşılan tüm değişkenler bu “defer” ifadesi içinde kullanılabilir.
Kapsamdan çıkış sırasında “defer”in en son çalıştığı unutulmamalıdır. Bu, programın “defer” ile karşılaşıldığı andaki değil, o andaki durumunu (değişken değerleri dahil) kullandığı anlamına gelir. Aşağıdaki kod “10” yazdıracaktır çünkü “defer” ifadesi “MyScore” “10” olarak ayarlandıktan hemen sonra çalışır.
var MyScore = 5
defer:
Print(MyScore)
set MyScore = 10
Bir “defer” ifadesini bir kapsam içinde son ifade olarak kullanmak, onu hiç kullanmamakla aynı şeydir. Örneğin, bu iki ifade seti tamamen aynı sırada çalışacaktır, bu nedenle “defer” gerekli değildir:
| defer olmadan | defer ile |
|---|---|
|
|