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

Parameter

Memberikan nilai

Variant<string, void>

create

Parameter

Memberikan nilai

isyieldable

Memberikan nilai

resume

Parameter

...: Variant

Memberikan nilai

Variant<Tuple, string>

running

Memberikan nilai

status

Parameter

Memberikan nilai

Parameter

Memberikan nilai

yield

Tuple<Variant>

Parameter

...: Tuple

Memberikan nilai

Tuple<Variant>