Menu
CoddyTech

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 coroutine

Khi 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.

challenge icon

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 initialMessage và 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
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