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.
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önlocal f = coroutine.wrap(task)-- Korutini yeniden başlatmak gibi davranın, sanki coroutine.resume() çağırdıklocal 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, Merhabaprint(coroutine.resume(repetitionCoro)) -- doğru, HelloHelloprint(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")) -- Merhabaprint(f()) -- MerhabaMerhabaprint(f()) -- HelloHelloHello
Özet
İşlevler
Verilen koruteni kapatır ve ölü bir duruma koyar.
Vücut f ile yeni bir korutin oluşturur, f f bir Luau işlevi olmalıdır.
Bu işlevin içinde çalıştırıldığı korutin varsa true döndürür, güvenle üretilebilir.
Korutinin çalıştırılmasını başlatır veya sürdürür co .
Çalışan koreografiyi geri verir.
Korutin co'nun durumunu bir diziolarak döndürür.
Yeni bir rutin oluşturur ve çağrıldığında rutini yeniden başlatan bir işlevi döndürür.
Korutinin yürütmesini askıya alır.
İş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
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
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
wrap
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.