coroutine
*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.
Sebuah koroutine digunakan untuk mengeksekuskan beberapa tugas sekaligus dari dalam script yang sama. Tugas-tugas ini mungkin termasuk menghasilkan nilai dari input atau melakukan pekerjaan pada subroutine saat menyelesaikan masalah yang lebih besar. Sebuah tugas bahkan tidak perlu memiliki titik akhir yang ditentukan, tetapi perlu menentukan
Menggunakan Coroutines
Sebuah fungsi baru dapat dibuat dengan memberikan fungsi untuk coroutine.create() . Setelah dibuat, fungsi tidak akan dimulai
local function task(...)
-- Fungsi ini mungkin melakukan beberapa pekerjaan untuk sedikit lalu menghasilkan beberapa nilai
coroutine.yield("first") -- Untuk dikembalikan oleh coroutine.resume()
-- Fungsi ini berlanjut setelah diresumkan lagi
return "second"
end
local taskCoro = coroutine.create(task)
-- Panggil resume untuk pertama kalinya, yang mengeksekusi fungsi dari awal
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> benar, pertama ( tugas bernama coroutine.yield()}
-- Lanjutkan mengeksekusi fungsi sampai hasilnya atau berhenti
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")
Selama masa hidup koroutine, Anda dapat memanggil coroutine.status() untuk mengeksplorasi statusnya:
<tbody><tr><td><b>ditangguhkan</b></td> <td>Rutinitas sedang menunggu untuk dilanjutkan. Rutinitas dimulai dalam estado ini dan masuk ketika fungsi mereka memanggil <code>coroutine.yield()</code> .</td></tr><tr><td><b>jalankan</b></td><td>Coroutine sedang berjalan sekarang.</td></tr><tr><td><b>biasa</b></td> <td>Rutin menunggu hasil dari rutin lain; dengan kata lain, ia telah mengambil kembali rutin lain.</td></tr><tr><td><b>mati</b></td> <td>Fungsi telah berhenti (kembali atau melemparkan kesalahan). Coroutine tidak dapat digunakan lebih lanjut.</td></tr></tbody>
Status | Makna |
---|
Mengemas Coroutines
Ketika bekerja dengan korutin, Anda juga dapat menyerahkan penggunaan objek korutin dan alih-alih menggunakan fungsi wrap. Such a wrap function will resume a particular korutin when it is called and will return only the yielded values. Anda dapat melakukan ini menggunakan coroutine.wrap() :
-- Buat rutinitas dan kembalikan fungsi lapas yang mengembalikannyalocal f = coroutine.wrap(task)-- Selidiki coroutine seolah-olah kita memanggil coroutine.resume()local result = f()-- Jika terjadi kesalahan, itu akan diangkat di sini!-- This differs from coroutine.resume() which acts similar to pcall()
Nilai pertama yang dikembalikan dari coroutine.resume() menggambarkan apakah coroutine berjalan tanpa kesalahan. Namun, fungsi yang dikembalikan oleh coroutine.wrap() tidak akan melakukan ini: alih-alih mereka langsung mengembalikan nilai yang dikembalikan atau dikirim ke
Contoh Pola Pemroduksi
Bayangkan tugas yang menghasilkan ulangan kata: setiap kali itu menghasilkan ulangan, yang berikutnya akan menghasilkan satu lagi. Misalnya, memberikan Hello akan menghasilkan Hello, HelloHello, dll. Untuk melakukan ini, Anda dapat mendefinisikan 2> peatThis
-- Fungsi ini mengulangi kata setiap kali rutinitnya diambil kembali
local function repeatThis(word)
local repetition = ""
while true do
-- Lakukan satu ulang lalu hasilkan hasilnya
repetition = repetition .. word
coroutine.yield(repetition)
end
end
Untuk mengeksekusi fungsi ini sebagai coroutine, Anda dapat menggunakan coroutine.create() diikuti oleh beberapa panggilan ke coroutine.resume() :
local repetitionCoro = coroutine.create(repeatThis)print(coroutine.resume(repetitionCoro, "Hello")) -- benar, Haloprint(coroutine.resume(repetitionCoro)) -- benar, HelloHelloprint(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello
Untuk fungsi produser ini, Anda juga dapat menggunakan coroutine.wrap() untuk mendapatkan fungsi yang menghasilkan nilai:
local f = coroutine.wrap(repeatThis)print(f("Hello")) -- Haloprint(f()) -- Haloprint(f()) -- HelloHelloHello