coroutine
*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.
Bir coroutine kullanılır, aynı anda aynı script'ten birden fazla görev yerine getirilir. Bu görevler, girdileri üretmek veya daha büyük bir sorunu çözmeye çalışırken bir subroutine'de işi yapmak gibi görünmektedir. Bir görevin yapılacağı yeri bile belir
Korutinleri Kullanıyor
Yeni bir coroutine oluşturmak için coroutine.create() ile bir işlev sağlayarak. Bir coroutine oluşturulduktan sonra, bir
local function task(...)
-- Bu işlev biraz iş yapabilir ve sonra biraz değer üretir
coroutine.yield("first") -- coroutine.resume() tarafından döndürülmek
-- İşlev tekrar başlatıldığında devam eder
return "second"
end
local taskCoro = coroutine.create(task)
-- İşlevi ilk çağır, bu da işlevi başlangıçta çağır
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> true, first (task called coroutine.yield()))
-- İşlevin işlemeye başladığından veya durduğundan emin olana kadar
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")
Coroutine'in ömründe, durumunu kontrol etmek için coroutine.status() diyebilirsiniz:
<tbody><tr><td><b>beklemez</b></td> <td>Rutin tekrar başlatılabilir olacak şekilde bekliyor. Rutinler bu durumda başlar ve onların işlevi <code>coroutine.yield()</code> çağrıldığında girer.</td></tr><tr><td><b>koşuyor</b></td><td>Şu anda coroutine çalışıyor.</td></tr><tr><td><b>normal</b></td> <td>Coroutine, başka bir coroutine'ın üretimini bekliyor; yani, başka bir coroutine'ı yeniden başlatıyor.</td></tr><tr><td><b>ölü)</b></td> <td>Fonksiyon durduruldu (bir hata döndürüldü veya çıkarıldı). Coroutine kullanılamaz.</td></tr></tbody>
Durum | Anlam |
---|
Korutinleri Wrapping
Korutinlerle çalışırken, coroutine objesinin kullanımını da göz ardı edebilirsiniz ve bunun yerine birWrap İşlevi kullanabilirsiniz. Bu, bir coroutine'ı özellikle yeniden çağırır ve sadece üretilen değerleri döndürür. Bunu yapmak için coroutine.wrap() kullanabilirsiniz:
-- Rutin oluştur ve bunu yeniden döndürme işlevini bir başlangıç fonksiyonu olarak iade etlocal f = coroutine.wrap(task)-- coroutine.resume()'i çağırıyor olsaydık coroutine'i devralalımlocal result = f()-- Bir hata oluşursa, buraya yükseltilecektir!-- This differs from coroutine.resume() which acts similar to pcall()
Library.coroutine.resume() ile ilk değer, hata olmadan bir coroutine'ın çalıştığını açıklar. Ancak, coroutine.wrap() ile döndürülen fonksiyonlar bunu yapmaz: onlar doğrudan döndürülen değerleri veya coroutine.yield()
Üretici Desen Örneği
Bir kelimenin tekrarlarını üreten bir görevi hayal edin: her bir tekrar üretildiğinde, bir sonraki üretecek. Örneğin, Hello ın bir tekrarını sağlamak, Hello , HelloHello, vb. gibi, yapmak için kullanabilirsiniz. Bunu yapm
-- Bu işlev, her yeniden başlatma sırasında bir kelime tekrarlar
local function repeatThis(word)
local repetition = ""
while true do
-- Sonra tekrar yap ve sonuçları ver
repetition = repetition .. word
coroutine.yield(repetition)
end
end
Bu işlevi bir rutin olarak çalıştırmak için şu adımları kullanabilirsiniz: coroutine.create() ile başlayan birkaç çağrı coroutine.resume() :
local repetitionCoro = coroutine.create(repeatThis)print(coroutine.resume(repetitionCoro, "Hello")) -- Evet, Merhabaprint(coroutine.resume(repetitionCoro)) -- Evet, Merhabaprint(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello
Bu üretici işlevi için ayrıca coroutine.wrap() kullanarak değer üreten bir işlev alabilirsiniz:
local f = coroutine.wrap(repeatThis)print(f("Hello")) -- Merhabaprint(f()) -- Merhabaprint(f()) -- HelloHelloHello