coroutine

Tampilkan yang Tidak Digunakan Lagi

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Sebuah koroutine digunakan untuk melakukan beberapa tugas pada saat bersamaan dari dalam skrip yang sama.Tugas semacam itu mungkin termasuk menghasilkan nilai dari input atau melakukan pekerjaan pada subrutin saat menyelesaikan masalah yang lebih besar.Sebuah tugas bahkan tidak perlu memiliki titik akhir yang didefinisikan, tetapi perlu mendefinisikan waktu tertentu di mana ia menghasilkan (jeda) untuk membiarkan hal-hal lain dikerjakan.

Menggunakan Coroutines

Rutinitas baru dapat dibuat dengan memberikan fungsi ke coroutine.create() .Setelah dibuat, sebuah korutin tidak mulai berjalan sampai panggilan pertama ke coroutine.resume() yang mengirimkan argumen ke fungsi.Panggilan ini kembali ketika fungsi berhenti atau memanggil coroutine.yield() dan, ketika ini terjadi, coroutine.resume() kembali nilai yang dikembalikan oleh fungsi, nilai yang dikirim ke coroutine.yield() , atau pesan kesalahan.Jika terjadi kesalahan, nilai pengembalian kedua adalah kesalahan yang dilemparkan.


local function task(...)
-- Fungsi ini mungkin melakukan beberapa pekerjaan untuk sementara kemudian menghasilkan beberapa nilai
coroutine.yield("first") -- Untuk dikembalikan oleh coroutine.resume()
-- Fungsi terus berlanjut setelah dilanjutkan lagi
return "second"
end
local taskCoro = coroutine.create(task)
-- Memanggil resume panggilan untuk pertama kalinya, yang menjalankan fungsi dari awal
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> benar, pertama ( tugas disebut coroutine.yield() )
-- Lanjutkan menjalankan fungsi sampai menghasilkan 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 memeriksa statusnya:


<th>Makna</th>
</tr>
</thead>
<tbody>
<tr>
<td><b>ditangguhkan</b></td>
<td>Korutin menunggu untuk dilanjutkan. Korutin dimulai dalam keadaan ini dan masuk ke dalamnya ketika fungsi mereka memanggil <code>coroutine.yield()</code>.</td>
</tr>
<tr>
<td><b>berjalan</b></td>
<td>Korutin sedang berjalan saat ini.</td>
</tr>
<tr>
<td><b>tidak normal</b></td>
<td>Koroutine menunggu hasil dari koroutine lain; dengan kata lain, ia telah melanjutkan koroutine lain.</td>
</tr>
<tr>
<td><b>meninggal</b></td>
<td>Fungsi telah berhenti (dikembalikan atau dilemparkan kesalahan). Korutin tidak dapat digunakan lebih lanjut.</td>
</tr>
</tbody>
Status

Mengemas Coroutines

Saat bekerja dengan coroutine, Anda juga dapat menghilangkan penggunaan objek coroutine dan sebagai gantinya menggunakan fungsi pembungkus.Fungsi wadah seperti itu akan melanjutkan korutin tertentu saat dipanggil dan hanya akan mengembalikan nilai yang diberikan.Anda dapat melakukan ini menggunakan coroutine.wrap() :


-- Buat coroutine dan kembalikan fungsi pembungkus yang melanjutkannya
local f = coroutine.wrap(task)
-- Lanjutkan korutin seolah-olah kita memanggil coroutine.resume()
local result = f()
-- Jika terjadi kesalahan, itu akan dibesarkan di sini!
-- This differs from coroutine.resume() which acts similar to pcall()

Nilai pertama yang dikembalikan dari coroutine.resume() menjelaskan apakah korutin berjalan tanpa kesalahan.Namun, fungsi yang dikembalikan oleh coroutine.wrap() tidak akan melakukan ini: sebagai gantinya, mereka langsung mengembalikan nilai yang dikembalikan atau dikirim ke coroutine.yield() , jika ada.Jika terjadi kesalahan saat menjalankan fungsi korutin, kesalahan dibangkitkan pada panggilan fungsi yang dikembalikan.

Contoh Pola Produser

Bayangkan tugas yang menghasilkan ulangan kata: setiap kali menghasilkan ulangan, yang berikutnya akan menghasilkan satu lagi.Sebagai contoh, memberikan Hello akan menghasilkan Hello , HelloHello , HelloHelloHello , dll.Untuk melakukan ini, Anda dapat mendefinisikan repeatThis() :


-- Fungsi ini mengulangi kata setiap kali coroutinenya dilanjutkan
local function repeatThis(word)
local repetition = ""
while true do
-- Lakukan satu repetisi lalu hasilkan hasil
repetition = repetition .. word
coroutine.yield(repetition)
end
end

Untuk menjalankan fungsi ini sebagai koroutine, Anda dapat menggunakan coroutine.create() diikuti dengan banyak panggilan ke coroutine.resume() :


local repetitionCoro = coroutine.create(repeatThis)
print(coroutine.resume(repetitionCoro, "Hello")) -- benar, Hello
print(coroutine.resume(repetitionCoro)) -- benar, HelloHello
print(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")) -- Halo
print(f()) -- HaloHalo
print(f()) -- HelloHelloHello

Rangkuman

Fungsi

Fungsi

close

Tutup dan menempatkan korutin yang disediakan dalam keadaan mati.Fungsi ini mengembalikan true kecuali coroutine berada dalam keadaan kesalahan, di mana ia mengembalikan false dan pesan kesalahan.Korutin yang saat ini sedang berjalan tidak dapat ditutup.Sebuah korutin tidak dapat dilanjutkan setelah ditutup.

Parameter

Memberikan nilai

true kecuali korutin yang ditutup berada dalam keadaan kesalahan.

Variant<string, ()>

Pesan pesan, jika ada.

create

Membuat coroutine baru, dengan tubuh f. f harus menjadi fungsi Luau.

Parameter

Memberikan nilai

isyieldable

Kembali true jika korutin fungsi ini dipanggil dalam dapat diandalkan dengan aman.Menyerahkan korutin di dalam metode atau fungsi C dilarang, dengan pengecualian pcall dan xpcall.

Memberikan nilai

Apakah coroutine dapat atau tidak dapat dengan aman menghasilkan pada titik ini.

resume

Memulai atau melanjutkan eksekusi coroutine co .Pertama kali Anda melanjutkan korutin, ia mulai menjalankan tubuhnya.Nilai ... diberikan sebagai argumen ke fungsi tubuh.Jika korutin telah menghasilkan, lanjutkan memulai ulangnya; nilai ... dikirim sebagai hasil dari yield.Jika korutin berjalan tanpa kesalahan, lanjutkan pengembalian benar plus nilai apa pun yang ditransmisikan ke yield (jika korutin menghasilkan) atau nilai apa pun yang dikembalikan oleh fungsi tubuh (jika korutin berakhir).Jika ada kesalahan, lanjutkan pengembalian false ditambah pesan kesalahan.

Parameter

...: Variant

Memberikan nilai

running

Kembalikan koroutine yang berjalan.

Memberikan nilai

status

Kembalikan status coroutine co, sebagai string: 'berjalan', jika coroutine sedang berjalan (yaitu, ia disebut status); 'terhenti', jika coroutine ditangguhkan dalam panggilan untuk menghasilkan, atau jika belum mulai berjalan; 'normal' jika coroutine aktif tetapi tidak berjalan (yaitu, ia telah menangguhkan coroutine lain); dan 'mati' jika coroutine telah menyelesaikan fungsi tubuhnya, atau jika telah berhenti dengan kesalahan.

Parameter

Memberikan nilai

Membuat coroutine baru, dengan tubuh f.f harus menjadi fungsi Luau.Kembalikan fungsi yang melanjutkan korutin setiap kali dipanggil.Argumen apa pun yang dikirim ke fungsi berperilaku sebagai argumen tambahan untuk dilanjutkan.Kembalikan nilai yang sama yang dikembalikan oleh resume, kecuali boolean pertama.Jika terjadi kesalahan, menyebarkan kesalahan.

Parameter

Memberikan nilai

yield

Tuple<Variant>

Menghentikan eksekusi koroutine panggil.Argumen apa pun untuk menghasilkan diberikan sebagai hasil tambahan untuk dilanjutkan.Menyerahkan korutin di dalam metode atau fungsi C dilarang, dengan pengecualian pcall dan xpcall.

Parameter

...: Tuple

Memberikan nilai

Tuple<Variant>