coroutine

Hiển Thị Bản Đã Lỗi Thời

*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ào
print(coroutine.resume(repetitionCoro)) -- đúng, Xin chào
print(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ào
print(f()) -- Xin chào
print(f()) -- HelloHelloHello

Tóm Tắt

Chức Năng

Chức Năng

close

Đóng và đặt coroutine đã cung cấp trong trạng thái chết. Chức năng này trả lại true trừ khi coroutine đang ở trạng thái lỗi, trong đó case nó trả lại false và thông điệp tin nhắn. Một coroutine đang chạy hiện tại không thể đóng cấp. Một coroutine

Tham Số

Lợi Nhuận

true trừ khi coroutine đó đóng vai trò là một trong những trạng thái lỗi.

Variant<string, void>

Tin nhắc tin nhắn, nếu có.

create

Tạo một coroutine mới, với body f. f phải là một hàm Lua.

Tham Số

Lợi Nhuận

isyieldable

Trả lại true nếu coroutine này được gọi trong có thể an toàn để ra mắt. Yielding một coroutine bên trong metamethods hoặc C functions là bị cấm, với ngoại lệ của pcallxpcall.

Lợi Nhuận

Dù có phải coroutine có thể đạt được điểm này an toàn hay không.

resume

Bắt đầu hoặc tiếp tục thi hành coroutine co . Lần đầu tiên bạn khởi động lại một coroutine, nó bắt đầu chạy cơ thâncủa

Tham Số

...: Variant

Lợi Nhuận

Variant<Tuple, string>

running

Trả lại coroutine đang chạy.

Lợi Nhuận

status

Trả lại trạng thái của coroutine co, như một chuỗi: 'chạy', nếu coroutine đang chạy (đó là, nó gọi status); 'tạm dừng', nếu coroutine đang tạm dừng trong một cuộc gọi để tạo, hoặc nó chưa bắt đầu tạo; 'bình thường' nế

Tham Số

Lợi Nhuận

Tạo một coroutine mới, với body f. f phải là một hàm Lua. Trả lại một hàm mà kết thúc coroutine mỗi khi nó được gọi. Trả lại các lệnh truyền cho hàm khi được gọi. Trả lại cùng một giá trị trả lại cho hàm khi được gọi. Trong trường hợp lỗi, phổ biến lỗi.

Tham Số

Lợi Nhuận

yield

Tuple<Variant>

Ngưng thi hành phần mềm được gọi. Bất kỳ lý do nào để truyền cho pcall đều được truyền như kết quả bổ sung để tiếp tục. Việc truyền một coroutine bên trong metamethodes hoặc các hàm C là bị cấm, với ngoại lệ của pcallxpcall .

Tham Số

...: Tuple

Lợi Nhuận

Tuple<Variant>