Lua không thể đưa ra các đối số ban đầu giá trị mới một cách kỳ diệu. Họ có thể không còn ở trên ngăn xếp nữa, tùy thuộc vào việc tối ưu hóa. Hơn nữa, không có dấu hiệu cho thấy mã khi nó mang lại, vì vậy nó có thể không thể nhìn thấy những đối số nữa. Ví dụ, nếu coroutine được gọi là một hàm, hàm mới đó không thể thấy các đối số được truyền vào hàm cũ.
coroutine.yield()
trả về các đối số được chuyển đến cuộc gọi resume
tiếp tục coroutine, để trang web của lệnh gọi năng suất có thể xử lý các tham số theo ý muốn. Nó cho phép mã thực hiện việc nối lại để giao tiếp với mã cụ thể làm việc sinh lợi. yield()
chuyển các đối số của nó dưới dạng giá trị trả lại từ resume
và resume
chuyển đối số của nó dưới dạng giá trị trả lại cho yield
. Điều này thiết lập một con đường giao tiếp.
Bạn không thể làm điều đó theo bất kỳ cách nào khác. Chắc chắn không phải bằng cách sửa đổi các đối số có thể không hiển thị trên trang web yield
. Nó đơn giản, thanh lịch và có ý nghĩa.
Ngoài ra, nó được coi là cực kỳ thô lỗ để đi chọc vào giá trị của một ai đó. Đặc biệt là một chức năng đã hoạt động. Hãy nhớ rằng: các đối số chỉ là các biến cục bộ chứa đầy các giá trị. Người dùng không nên mong đợi nội dung của các biến đó thay đổi trừ khi nó thay đổi chính nó. Tuy nhiên, chúng là các biến số local
. Chúng chỉ có thể được thay đổi cục bộ; do đó tên.
Nguồn
2012-11-16 21:19:20
Tôi cảm thấy như thế này không trả lời được câu hỏi.OP là về/C API/hàm lua_resume() và lua_yield(), có ngữ nghĩa khác với thư viện chuẩn 'coroutine.resume()', v.v. (Ví dụ, lua_resume lấy ba đối số - hai trong số đó là lua_State ...) – BadZen
Tôi nghĩ rằng nó trả lời câu hỏi về mục đích chuyển các tham số và cung cấp một ví dụ dễ dàng để thử có một thông dịch viên Lua. Trong thực tế, OP cho biết nhiều trong bình luận của mình theo câu trả lời của Nicol. Bạn luôn có thể cung cấp câu trả lời của riêng mình nếu bạn nghĩ mình có câu trả lời hay hơn. –
Có một sự khác biệt lớn giữa đối tượng coroutine trong libs (ví dụ như đóng gói một lua_State) và sử dụng API C. Tôi không có câu trả lời hay hơn, vì vậy tôi đã mở một câu hỏi khác hỏi cụ thể về API C. Câu trả lời của Nichol và của bạn ở đây đều nói về đối tượng thư viện coroutine. Có khoảng 100 dòng mã thực hiện điều đó theo API lua_ *. Nó không rõ ràng, và tài liệu ngắn gọn về chi tiết. – BadZen