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
Özet
İşlevler
Sunulan coroutine'ı ölü bir devlet getirir.
Bir yeni rutin oluşturur, body f. f must be a Lua function.
Eğer true içindeki rutin bu işlevi güvenli bir şekilde yerine getirirse işlevi işe alır.
Rutin co ın çalışmasını başlatır veya devam eder.
Çalışan rutini iade eder.
Coroutine co'nun durumunu bir dizi olarak iade eder.
Yeni bir coroutine oluşturur ve çağrıldığında coroutine'i yeniden başlatır.
Rutinenin çalıştırılmasını askıya alır.
İşlevler
close
Kapatır ve sağlanan coroutine'ı ölü bir devlette yerleştirir. Bu işlev true dır, aksi takdirde false ve hata mesajını iade eder. Şu anda çalışan bir coroutine kapatılamaz. Bir coroutine kapatıldıktan sonra yeniden başlanmaz.
Parametreler
resume
Starts or continues the execution of coroutine co . The first time you resume a coroutine, it starts running its vücut. The values ... are passed as the arguments to the body function. If the coroutine has yielded, resume restarts it; the values ...
Parametreler
status
Coroutine'in durumunu bir dizi olarak 'koşma', 'bekleme', 'yapımda' veya 'yetme' olarak iade eder, eğer durum 'koşma' ise (yani durum statusını arıyor) veya 'bekleme' veya 'yetme' olarak iade eder, eğer durum 'yapımda' veya 'yetme' ise (yani durum durumunu arıyor
Parametreler
Dönüşler
wrap
Yeni bir coroutine oluşturur, body f. f'nin bir Lua işlevi olması gerekir. Her çağrıda coroutine'i yeniden başlatan bir işlev olmalıdır. Arjeleri işlevi her çağrıda yeniden başlatan ekstra argeler olarak iade eder. Aynı değerleri içeren işlevin değerleri hata olarak yeniden yazılır. Hata durumunda, hata yeniden yazılır.