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.

A korutin aynı senaryodan aynı anda çok sayıda görev yerine getirmek için kullanılır.Bu görevler, girişlerden değerler üretmek veya daha büyük bir sorunu çözerken bir alt rutinde çalışmak gibi işleri içerebilir.Bir görevin belirlenmiş bir bitiş noktasına ihtiyacı bile yok, ancak diğer şeyler üzerinde çalışmasına izin vermek için belirli zamanları tanımlaması gerekiyor veriyor (bekleme).

Korutinleri Kullanma

Yeni bir korutin, coroutine.create() 'ye bir işlev sağlayarak oluşturulabilir.Bir kez oluşturulduktan sonra, bir işlevin argümanlarını aktaran ilk çağrıya kadar bir korutin çalışmaya başlamaz coroutine.resume() .Bu çağrı, işlev durur veya çağrır coroutine.yield() ve bu gerçekleştiğinde, coroutine.resume() işlev tarafından döndürülen değerleri, coroutine.yield() gönderilen değerleri veya bir hata mesajını döndürür.Hata yaparsa, ikinci dönüş değeri atılan hata olur.


local function task(...)
-- Bu işlev biraz iş yapabilir, sonra biraz değer verebilir
coroutine.yield("first") -- coroutine.resume() tarafından geri dönmek için
-- İşlev yeniden başlatıldıktan sonra devam eder
return "second"
end
local taskCoro = coroutine.create(task)
-- İşlevi başından beri çalan ilk kez çağrı yeniden başlatma
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> true, önce (görev coroutine.yield() olarak adlandırıldı)
-- Verimli veya durdurana kadar işlevi çalıştırmaya devam edin
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")

Korutinin ömrü boyunca, durumunu denetlemek için coroutine.status() 'yi çağırabilirsiniz:


<th>Anlam</th>
</tr>
</thead>
<tbody>
<tr>
<td><b>askıya alındı</b></td>
<td>Korutin yeniden başlatılmayı bekliyor. Korutinler bu durumda başlıyor ve işlevleri <code>coroutine.yield()</code> çağırdığında ona giriyor.</td>
</tr>
<tr>
<td><b>çalışmak</b></td>
<td>Korutin şu anda çalışıyor.</td>
</tr>
<tr>
<td><b>normal</b></td>
<td>Korutin başka bir korutinin verimini bekliyor; başka bir deyişle, başka bir korutini yeniden başlattı.</td>
</tr>
<tr>
<td><b>ölü</b></td>
<td>İşlev durdu (döndürüldü veya bir hata atıldı). Korutin daha fazla kullanılamaz.</td>
</tr>
</tbody>
Durum

Korutinleri Sarma

Korutinlerle çalışırken, ayrıca korutin nesnesinin kullanımından vazgeçebilir ve bunun yerine bir kapalı işlev kullanabilirsiniz.Böyle bir kapalı işlev, çağrıldığında belirli bir korutin devam edecek ve sadece verilen değerleri geri verecektir.Bunu coroutine.wrap() kullanarak yapabilirsiniz:


-- Korutin oluştur ve onu yeniden başlatan bir kapak işlevi geri dön
local f = coroutine.wrap(task)
-- Korutini yeniden başlatmak gibi davranın, sanki coroutine.resume() çağırdık
local result = f()
-- Bir hata oluşursa burada yüksekte tutulacaktır!
-- This differs from coroutine.resume() which acts similar to pcall()

coroutine.resume() 'dan ilk değer döndürülen değer, bir rutinin hata olmadan çalışıp çalışmadığını tanımlar.Ancak, coroutine.wrap() tarafından döndürülen işlevler bunu yapmayacak: bunun yerine, eğer varsa, doğrudan döndürülen değerleri veya coroutine.yield() 'a geçirilen değerleri geri verecekler.Korutin işlevi çalışırken bir hata oluşursa, hata döndürülen işlevin çağrısında yükseltilir.

Üretici Desen Örneği

Bir kelimenin tekrarlarını üreten bir görevi hayal edin: her tekrar ürettiğinde, bir sonraki tekrar bir tane daha üretecek.Örneğin, Hello sağlayarak Hello , HelloHello , HelloHelloHello gibi üretecektir.Bunu yapmak için, repeatThis() tanımlayabilirsiniz:


-- Bu işlev, korutinin yeniden başladığı her seferinde bir kelimeyi tekrarlar
local function repeatThis(word)
local repetition = ""
while true do
-- Bir tekrar yap ve sonra sonuçver
repetition = repetition .. word
coroutine.yield(repetition)
end
end

Bu işlevi bir rutin olarak çalıştırmak için, ardından birden fazla çağrı kullanabilirsiniz:


local repetitionCoro = coroutine.create(repeatThis)
print(coroutine.resume(repetitionCoro, "Hello")) -- doğru, Merhaba
print(coroutine.resume(repetitionCoro)) -- doğru, HelloHello
print(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello

Bu üretici işlevi için, değer üreten bir işlev almak için coroutine.wrap()'yi de kullanabilirsiniz:


local f = coroutine.wrap(repeatThis)
print(f("Hello")) -- Merhaba
print(f()) -- MerhabaMerhaba
print(f()) -- HelloHelloHello

Özet

İşlevler

İşlevler

close

Verilen koruteni kapatır ve ölü bir duruma koyar.Bu işlev, rutin bir hata durumunda olmadığı sürece true döndürür, bu durumda false ve hata mesajı döndürür.Şu anda çalışan bir rutin kapatılamaz.Bir rutin kapatıldıktan sonra yeniden başlatılamaz.

Parametreler

Dönüşler

true korutör kapatılırken hata durumunda olmadığı sürece, kapatılan korutörün durumu kapalıdır.

Variant<string, ()>

Hata mesajı, varsa.

create

Vücut f ile yeni bir korutin oluşturur, f f bir Luau işlevi olmalıdır.

Parametreler

Dönüşler

isyieldable

Bu işlevin içinde çalıştırıldığı korutin varsa true döndürür, güvenle üretilebilir.Metodların veya C işlevlerinin içinde bir korutinin teslim edilmesi, pcall ve xpcall dışında yasaktır.

Dönüşler

Korutin bu noktada güvenle üretilebilir mi veya değil mi.

resume

Korutinin çalıştırılmasını başlatır veya sürdürür co .Bir korutin yeniden başladığınız ilk kez, vücudunu çalıştırmaya başlar.Değerler ... vücut işlevine argüman olarak geçer.Korutin kazandıysa, yeniden başlatmayı yeniden başlat; değerler ... yield'den sonuç olarak geçer.Korutin herhangi bir hata olmadan çalışırsa, geri dönüşler yeniden başlar doğru artı herhangi bir değer geçirilir (korutin verirse) veya vücut işlevi tarafından geri gönderilen herhangi bir değer (korutin sona ererse).Herhangi bir hata varsa, devam etme geri dönüşü yanlış artı hata mesajıdır.

Parametreler

...: Variant

Dönüşler

running

Çalışan koreografiyi geri verir.

Dönüşler

status

Korutin durumunu bir diziolarak döndürür: 'çalışıyor', eğer korutin çalışıyorsa; 'beklendi', eğer korutin bir üretimde askıya alındıysa veya henüz çalışmaya başlamadıysa; 'normal', eğer korutin aktif fakat henüz çalışmıyorsa veya bir hata ile durdurulduysa; ve 'ölü', eğer korutin vücut işlevini bitirdiyse veya henüz çalışmaya başlamadıysa.

Parametreler

Dönüşler

Vücut f ile yeni bir korutin oluştururf bir Luau işlevi olmalı.Her çağrıldığında korutuyu yeniden başlatan bir işlev döndürür.Fonksiyona geçirilen herhangi bir argüman, devam etmek için ek argümanlar olarak davranır.Yeniden başlatma tarafından döndürülen değerlerin aynısını döndürür, ilk mantıksal değer hariç.Hata durumunda, hataları yayar.

Parametreler

Dönüşler

yield

Tuple<Variant>

Çağrılan koroletin yürütmesini askıya alır.Vazgeçmek için herhangi bir argüman ekstra sonuç olarak devralınır.Metodların veya C işlevlerinin içinde bir korutinin teslim edilmesi, pcall ve xpcall dışında yasaktır.

Parametreler

...: Tuple

Dönüşler

Tuple<Variant>