coroutine
*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.
Một coroutine được sử dụng để thực hiện nhiều nhiệm vụ tại cùng một thời điểm từ trong cùng một script. Các nhiệm vụ này có thể bao gồm sản xuất giá trị từ các nguồn dữ liệu hoặc thực hiện công việc trên một sub
Sử dụng Coroutines
Một coroutine mới có thể được tạo bằng cách cung cấp một hàm để coroutine.create() . Sau khi tạ
local function task(...)
-- Hàm này có thể làm một số công việc cho một chút sau đó đưa ra một số giá trị
coroutine.yield("first") -- Để được trả lại bởi coroutine.resume()
-- Hành động này tiếp tục một lần nữa khi được bắt đầu lại
return "second"
end
local taskCoro = coroutine.create(task)
-- Gọi lại cho lần đầu tiên, thiết lập chức năng từ đầu
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> true, first (nhãn task là coroutine.yield()}
-- Tiếp tục thi hành chức năng cho đến khi nó tạo ra hoặc dừng lại
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")
Trong suốt cuộc sống của coroutine, bạn có thể gọi coroutine.status() để kiểm tra tình trạng tháicủa nó:
<tbody><tr><td><b>đã zawieszenie</b></td> <td>Hàm đợi để bắt đầu lại. Hàm bắt đầu ở trạng thái này và nhập nó khi chức năng của họ gọi <code>coroutine.yield()</code> .</td></tr><tr><td><b>chạy</b></td><td>Hành động đang được thực hiện ngay bây giờ.</td></tr><tr><td><b>bình thường</b></td> <td>Hàm đợi để tạo ra một hàm khác; với những lời khác, nó đã bắt đầu một hàm khác.</td></tr><tr><td><b>chết</b></td> <td>Hàm đã dừng (đã trả lại hoặc ném một lỗi). Coroutine không thể được sử dụng tiếp theo.</td></tr></tbody>
Tình trạng | Ý nghĩa |
---|
Đóng gói Coroutines
Khi làm việc với các hàm coroutine, bạn cũng có thể từ bỏ sử dụng objeto coroutine và thay vào đó sử dụng một hàm wrap. Một hàm wrap này sẽ kết thúc một coroutine cụ thể khi nó được gọi và chỉ trả lại các giá trị đã được tạo ra. Bạn có thể làm điều này bằng cách sử dụ
-- Tạo coroutine và trả lại một hàm wrapping để kết thúc nólocal f = coroutine.wrap(task)-- Tổng kết coroutine như thể chúng ta gọi coroutine.resume()local result = f()-- Nếu một lỗi xảy ra, nó sẽ được nêu lên ở đây!-- This differs from coroutine.resume() which acts similar to pcall()
Giá trị đầu tiên được trả từ coroutine.resume() mô tả liệu một coroutine có được mà không có lỗi. Tuy nhiên, các hàm được trả từ bởi coroutine.wrap() sẽ không làm điều đó
Ví dụ mẫu nhà sản xuất
Hãy tưởng tượng một công việc sản xuất lặp lại một từ: mỗi lần nó sản xuất một lặp lại, một lần nữa sẽ sản xuất thêm một lần nữa. Ví dụ, cung cấp Hello sẽ sản xuất
-- Hàm này lặp lại một từ mỗi khi coroutine của nó được khởi động lại
local function repeatThis(word)
local repetition = ""
while true do
-- Làm một lần lặp lại sau đó tạo kết quả
repetition = repetition .. word
coroutine.yield(repetition)
end
end
Để thực hiện chức năng này như một coroutine, bạn có thể sử dụng coroutine.create() đi kèm với nhiều gọi coroutine.resume() :
local repetitionCoro = coroutine.create(repeatThis)print(coroutine.resume(repetitionCoro, "Hello")) -- true, Xin chàoprint(coroutine.resume(repetitionCoro)) -- đúng, Xin chàoprint(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello
Đối với chức năng này, bạn cũng có thể sử dụng coroutine.wrap() để nhận được một chức năng sản xuất giá trị:
local f = coroutine.wrap(repeatThis)print(f("Hello")) -- Xin chàoprint(f()) -- Xin chàoprint(f()) -- HelloHelloHello