Resume và 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 51 trên 54.
Trong bài học trước, bạn đã học cách một coroutine có thể truyền giá trị về đoạn code chính bằng coroutine.yield(). Nhưng việc trao đổi có thể diễn ra theo cả hai chiều. Bạn cũng có thể gửi giá trị vào một coroutine khi tiếp tục chạy nó.
Khi gọi coroutine.resume() với các đối số bổ sung sau đối tượng coroutine, các đối số đó sẽ được truyền vào coroutine. Bên trong coroutine, các giá trị này trở thành giá trị trả về của lệnh gọi coroutine.yield() đã tạm dừng coroutine.
Cách hoạt động như sau:
function receiver()
print("Coroutine started")
local value = coroutine.yield()
print("Received: " .. value)
end
local co = coroutine.create(receiver)
coroutine.resume(co) -- Bắt đầu chạy rồi tạm dừng tại yield
coroutine.resume(co, "Hello") -- Truyền "Hello" vào coroutineKhi coroutine tiếp tục chạy lần thứ hai, chuỗi "Hello" được truyền vào và trở thành giá trị trả về của coroutine.yield(), rồi được lưu vào biến value.
Thử thách
DễViết một hàm createEchoCoroutine nhận initialMessage và trả về một chuỗi thể hiện giao tiếp hai chiều giữa code chính và một coroutine.
Tạo một coroutine trước tiên yield initialMessage, sau đó nhận phản hồi khi được tiếp tục chạy, rồi yield phản hồi đó trở lại. Hàm này cần thể hiện việc truyền giá trị cả vào và ra khỏi coroutine.
Logic:
- Tạo một hàm yield
initialMessagevà lưu giá trị trả về từ lần yield đó - Sau khi nhận giá trị, yield giá trị đó trở lại
- Bọc hàm này trong một coroutine bằng
coroutine.create() - Tiếp tục chạy coroutine lần đầu để lấy thông điệp ban đầu
- Tiếp tục chạy coroutine lần thứ hai và truyền vào
"Response" - Lấy giá trị được yield từ lần tiếp tục chạy thứ hai
- Trả về một chuỗi theo định dạng:
First: [first_yield]\nSecond: [second_yield]
Tham số:
initialMessage(chuỗi): Thông điệp mà coroutine sẽ yield đầu tiên
Giá trị trả về: Một chuỗi thể hiện cả hai giá trị được yield, phân tách bằng ký tự xuống dòng (chuỗi). Định dạng: First: Hello\nSecond: Response
Tự làm thử
function createEchoCoroutine(initialMessage)
-- 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