Tạm dừng bằng coroutine.yield()
Thuộc phần Logic và luồng chương trình trong hành trình Lua của Coddy. Bài học 50 trên 54.
coroutine.yield(). Nhờ đó, coroutine có thể tạm dừng giữa chừng khi đang chạy và trả quyền điều khiển lại cho đoạn code đã tiếp tục chạy nó.Khi một coroutine gọi coroutine.yield(), nó sẽ dừng chạy ngay tại thời điểm đó. Lần tiếp theo bạn gọi coroutine.resume() trên coroutine ấy, nó sẽ tiếp tục chạy ngay sau lệnh gọi yield(), như thể không có chuyện gì xảy ra.Đây là một ví dụ đơn giản:function countToThree()
print("One")
coroutine.yield()
print("Two")
coroutine.yield()
print("Three")
end
local co = coroutine.create(countToThree)
coroutine.resume(co) -- In ra "One", rồi tạm dừng
coroutine.resume(co) -- In ra "Two", rồi tạm dừng
coroutine.resume(co) -- In ra "Three", rồi kết thúcresume() chạy coroutine cho đến khi gặp yield(). Coroutine ghi nhớ chính xác vị trí nó dừng lại, bao gồm tất cả biến cục bộ và trạng thái thực thi.Bạn cũng có thể truyền giá trị trở lại khi tạm dừng. Mọi đối số bạn truyền cho coroutine.yield() sẽ trở thành giá trị trả về của coroutine.resume(). Lưu ý rằng coroutine.resume() luôn trả về một giá trị boolean trạng thái làm giá trị đầu tiên (true nếu coroutine chạy không gặp lỗi hoặc false nếu xảy ra lỗi), sau đó là mọi giá trị được truyền cho yield():function giveNumbers()
coroutine.yield(10)
coroutine.yield(20)
end
local co = coroutine.create(giveNumbers)
-- status là true, value là 10
local status, value = coroutine.resume(co)
print(value) -- In ra: 10
-- status là true, value là 20
status, value = coroutine.resume(co)
print(value) -- In ra: 20Thử thách
DễViết một hàm createYieldingCoroutine nhận count và trả về chuỗi thể hiện đầu ra từ một coroutine tạo ra giá trị nhiều lần.
Tạo một coroutine tạo ra chuỗi "Step X" cho mỗi bước từ 1 đến count, tổng cộng count bước. Tiếp tục coroutine count lần để thu thập tất cả giá trị được tạo ra. Trả về tất cả giá trị được tạo ra, nối với nhau bằng ký tự xuống dòng.
Logic:
- Tạo một hàm dùng vòng lặp để tạo ra
"Step 1","Step 2", v.v., cho đếncount - Sau khi tạo ra tất cả giá trị, hàm sẽ hoàn tất, không tạo ra giá trị cuối cùng là "Done"
- Đặt hàm này trong một coroutine bằng
coroutine.create() - Tiếp tục coroutine
countlần, thu thập từng giá trị được tạo ra - Nối tất cả giá trị được tạo ra, đặt ký tự xuống dòng ở giữa
- Trả về chuỗi đã nối
Tham số:
count(number): Số bước cần tạo ra
Giá trị trả về: Chuỗi chứa tất cả giá trị được tạo ra, phân tách bằng ký tự xuống dòng (string). Định dạng: Step 1\nStep 2\nStep 3
Tự làm thử
function createYieldingCoroutine(count)
-- Viết code ở đây
end
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng chương trình
2Các hàm khác của thư viện table
table.concat()Tạo table và unpack()table.sort()Sắp xếp tùy chỉnh bằng hàmÔn tập: Bảng điểm cao5Dự án: Bộ máy trò chơi phiêu lưu bằng văn bản
Thiết lập dự án: Căn phòngLiên kết các phòng3Các khái niệm nâng cao về hàm
Trả về nhiều giá trịHàm nhận số lượng đối số linh hoạt (...)Hàm là giá trị hạng nhấtHàm ẩn danhClosure là gì?Ôn tập: bộ xử lý sự kiện đơn giản9Coroutine cho người mới bắt đầu
Coroutine là gì?Tạo và tiếp tục coroutineTạm dừng bằng coroutine.yield()Resume và yieldKiểm tra trạng thái coroutineÔn tập: trình tạo sốÔn tập: phép toán vectơTự luyện tập: Trình biên dịch Lua online