coroutine.yield() ile Duraklatma
Coddy'nin Lua Journey'sinin Logic & Flow bölümünün bir parçası — ders 50 / 54.
Coroutine'lerin gerçek gücü coroutine.yield() fonksiyonundan gelir. Bu, bir coroutine'in yürütmenin ortasında kendisini duraklatmasına ve kontrolü onu devam ettiren koda geri vermesine olanak tanıyan şeydir.
Bir coroutine coroutine.yield() fonksiyonunu çağırdığında, tam o noktada çalışmayı anında durdurur. Bu coroutine üzerinde coroutine.resume() fonksiyonunu bir sonraki çağırışınızda, sanki hiçbir şey olmamış gibi tam yield() çağrısından hemen sonraki yerden devam edecektir.
İşte basit bir örnek:
function countToThree()
print("One")
coroutine.yield()
print("Two")
coroutine.yield()
print("Three")
end
local co = coroutine.create(countToThree)
coroutine.resume(co) -- "One" yazdırır, sonra duraklar
coroutine.resume(co) -- "Two" yazdırır, sonra duraklar
coroutine.resume(co) -- "Three" yazdırır, sonra biterHer bir resume() çağrısının, bir yield() ile karşılaşana kadar coroutine'i nasıl çalıştırdığına dikkat edin. Coroutine, tüm yerel değişkenleri ve yürütme durumu dahil olmak üzere tam olarak nerede durduğunu hatırlar.
Yield işlemi yaparken değerleri geri de döndürebilirsiniz. coroutine.yield() fonksiyonuna verdiğiniz tüm argümanlar, coroutine.resume() fonksiyonunun dönüş değerleri olur:
function giveNumbers()
coroutine.yield(10)
coroutine.yield(20)
end
local co = coroutine.create(giveNumbers)
local status, value = coroutine.resume(co)
print(value) -- Çıktı: 10
status, value = coroutine.resume(co)
print(value) -- Çıktı: 20Görev
Kolaycount parametresini alan ve birden fazla kez değer döndüren (yield) bir coroutine'den gelen çıktıyı gösteren bir dize döndüren createYieldingCoroutine fonksiyonunu yazın.
1'den count değerine kadar her adım için "Step X" dizesini döndüren ve bittiğinde "Done" yazdıran bir coroutine oluşturun. Tüm döndürülen değerleri ve son tamamlanmayı almak için coroutine'i count + 1 kez devam ettirin (resume). Döndürülen tüm değerleri yeni satırlarla birleştirerek döndürün.
Mantık:
countdeğerine kadar"Step 1","Step 2"vb. değerleri döndürmek için bir döngü kullanan bir fonksiyon oluşturun- Tüm döndürme işlemlerinden sonra fonksiyon tamamlanmalıdır ( "Done" için son bir yield işlemi yok)
- Bu fonksiyonu
coroutine.create()kullanarak bir coroutine içine alın - Coroutine'i
countkez devam ettirin ve döndürülen her değeri toplayın - Döndürülen tüm değerleri aralarına yeni satır karakterleri koyarak birleştirin
- Birleştirilmiş dizeyi döndürün
Parametreler:
count(sayı): Döndürülecek adım sayısı
Döndürür: Yeni satırlarla ayrılmış, döndürülen tüm değerleri içeren bir dize (string). Format: Step 1\nStep 2\nStep 3
Kopya kağıdı
coroutine.yield() fonksiyonu, bir coroutine'in yürütmeyi duraklatmasına ve kontrolü çağırana geri vermesine olanak tanır. coroutine.resume() tekrar çağrıldığında, coroutine yield() çağrısının hemen sonrasından devam eder.
coroutine.yield() fonksiyonunun temel kullanımı:
function countToThree()
print("One")
coroutine.yield()
print("Two")
coroutine.yield()
print("Three")
end
local co = coroutine.create(countToThree)
coroutine.resume(co) -- "One" yazdırır, sonra duraklar
coroutine.resume(co) -- "Two" yazdırır, sonra duraklar
coroutine.resume(co) -- "Three" yazdırır, sonra bitercoroutine.yield() ile değer döndürme:
function giveNumbers()
coroutine.yield(10)
coroutine.yield(20)
end
local co = coroutine.create(giveNumbers)
local status, value = coroutine.resume(co)
print(value) -- Yazdırır: 10
status, value = coroutine.resume(co)
print(value) -- Yazdırır: 20coroutine.yield() fonksiyonuna iletilen argümanlar, coroutine.resume() fonksiyonunun dönüş değerleri olur. Coroutine, yield çağrıları arasında tüm yerel değişkenleri ve yürütme durumunu korur.
Kendin dene
function createYieldingCoroutine(count)
-- Kodunuzu buraya yazın
end
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Logic & Flow bölümündeki tüm dersler
1İleri Düzey Tablo Yineleme
pairs() ile Yinelemeipairs() ile Yinelemepairs() vs. ipairs()Özet - Karakter Sayfası2Daha Fazla Tablo Kütüphanesi Fonksiyonu
table.concat()Tablo Oluşturma ve unpack()table.sort()Fonksiyonlar ile Özel SıralamaÖzet - Yüksek Skor Tablosu3İleri Düzey Fonksiyon Kavramları
Birden Fazla Değer DöndürmeVariadic Fonksiyonlar (...)Birinci Sınıf Değer Olarak FonksiyonlarAnonim FonksiyonlarClosure Nedir?Özet - Basit Event Handler9Yeni Başlayanlar İçin Coroutine'ler
Coroutine Nedir?coroutine create ve resumecoroutine.yield() ile Duraklatmaresume ve yieldCoroutine Durumunu Kontrol EtmeÖzet - Sayı ÜreticiÖzet - Vektör Matematiği