Menu
CoddyTech

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.

Sức mạnh thực sự của coroutine đến từ hàm 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úc
Hãy chú ý cách mỗi lần gọi resume() 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: 20
challenge icon

Thử 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 đến count
  • 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 count lầ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
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch Lua online