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 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>
StatusMakna

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 mengembalikannya
local 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, Halo
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()) -- Halo
print(f()) -- HelloHelloHello

Rangkuman

Fungsi

Fungsi

close

Tutup dan letakkan coroutine yang disediakan dalam keadaan mati. Fungsi ini mengembalikan true kecuali coroutine berada dalam keadaan kesalahan, di mana kasusnya mengembalikan false dan pesan kesalahan. Coroutine yang saat ini berjalan tidak dapat ditutup. Coroutine tidak dapat dilanjutkan setelah ditutup.

Parameter

Memberikan nilai

true kecuali koroutine ditutup dalam kondisi kesalahan.

Variant<string, void>

Pesan pesan, jika ada.

create

Menciptakan coroutine baru, dengan body f. f harus menjadi fungsi Lua.

Parameter

Memberikan nilai

isyieldable

Mengembalikan true jika fungsi coroutine ini dianggap dalam dapat dengan aman menghasilkan. Memberikan fungsi coroutine di dalam metamethode atau fungsi C dilarang, dengan pengecualian pcall dan xpcall.

Memberikan nilai

Apakah atau tidak rutinitas dapat dibayar dengan selamat pada saat ini.

resume

Memulai atau melanjutkan eksekusi coroutine co . Pertama kali Anda mengambil ulang coroutine, itu memulai mengeksekusi tubuhnya. Anggota ... diberikan sebagai argumen ke pesantub

Parameter

...: Variant

Memberikan nilai

Variant<Tuple, string>

running

Mengembalikan rutinitas yang sedang dijalankan.

Memberikan nilai

status

Mengembalikan status coroutine co, sebagai string: 'jalankan', jika coroutine sedang dijalankan (yaitu, menyebutkan status); 'ditunda', jika coroutine sedang ditunda dalam panggilan untuk menghasilkan, atau jika itu belum dimulai; 'normal' jika coroutine sedang aktif tetapi belum menjalankan (yaitu, mengambil kembali fungsi tubuh lainnya); dan 'mati' j

Parameter

Memberikan nilai

Menciptakan coroutine baru, dengan body f. f harus menjadi fungsi Lua. Mengembalikan fungsi yang mengambil kembali coroutine setiap kali panggilan. Memberikan argumen yang dilewati ke fungsi sebagai argumen tambahan untuk mengambil kembali. Mengembalikan nilai yang sama yang dikembalikan oleh resume, kecuali argumen pertama. Dalam kasus kesalahan, menyebarkan kesalahan.

Parameter

Memberikan nilai

yield

Tuple<Variant>

Menghentikan eksekusi korutina panggilan. Setiap argumen untuk menghasilkan ditangani sebagai hasil tambahan untuk dilanjutkan. Mengendalikan korutina di dalam metametode atau fungsi C adalah dilarang, dengan pengecualian pcall dan xpcall .

Parameter

...: Tuple

Memberikan nilai

Tuple<Variant>