coroutine

Artık kullanılmayanları göster

*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>
DurumAnlam

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 et
local f = coroutine.wrap(task)
-- coroutine.resume()'i çağırıyor olsaydık coroutine'i devralalım
local 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, Merhaba
print(coroutine.resume(repetitionCoro)) -- Evet, Merhaba
print(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")) -- Merhaba
print(f()) -- Merhaba
print(f()) -- HelloHelloHello

Özet

İşlevler

İş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

Dönüşler

true eğer düğüm kapatılmış değilse.

Variant<string, void>

Hata mesajı, varsa.

create

Bir yeni rutin oluşturur, body f. f must be a Lua function.

Parametreler

Dönüşler

isyieldable

Metodun içinde çağrılan bu işlev true işlevi içinde işlenir. Metodların veya C fonksiyonlarının içindeki bir coroutine'ı işlemek yasaktır, pcall ve xpcall hariç.

Dönüşler

Bu noktada rutinin güvenli bir şekilde üretilebilir olup olmadığı.

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

...: Variant

Dönüşler

Variant<Tuple, string>

running

Çalışan rutini iade eder.

Dönüşler

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

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.

Parametreler

Dönüşler

yield

Tuple<Variant>

Çağrılan rutinin iflasını askıya alır. Verilecek herhangi bir argüman ekstra sonuç olarak iade edilir. metametodların veya C fonksiyonlarının içindeki bir coroutine'ı askıya almak yasaktır, pcall ve xpcall dışında.

Parametreler

...: Tuple

Dönüşler

Tuple<Variant>