Cách thực hiện nhiều nhiệm vụ phụ thuộc vào việc triển khai Lua bạn đang sử dụng. Việc thực hiện là miễn phí để làm những việc dù sao nó thích miễn là nó bảo tồn ngữ nghĩa. Đó là, bất kể mọi thứ được thực hiện như thế nào, bạn sẽ nhận được kết quả tương tự như khi bạn đã lưu tất cả các giá trị trong RHS trước khi gán chúng cho LHS, như sách Lua giải thích.
Nếu bạn vẫn tò mò về việc triển khai thực tế, một điều bạn có thể làm là xem mã bytecode được sản xuất cho một chương trình nhất định. Ví dụ, dùng chương trình sau đây
local x,y = 10, 11
x,y = y,x
và đi qua nó để trình biên dịch bytecode (luac -l
) cho Lua 5.2 cho
main <lop.lua:0,0> (6 instructions at 0x9b36b50)
0+ params, 3 slots, 1 upvalue, 2 locals, 2 constants, 0 functions
1 [1] LOADK 0 -1 ; 10
2 [1] LOADK 1 -2 ; 11
3 [2] MOVE 2 1
4 [2] MOVE 1 0
5 [2] MOVE 0 2
6 [2] RETURN 0 1
Các opcode MOVE gán giá trị vào sổ đăng ký quyền thanh ghi bên trái (xem lopcodes.h trong nguồn Lua để biết thêm chi tiết). Rõ ràng, những gì đang xảy ra là các thanh ghi 0 và 1 đang được sử dụng cho x
và y
và khe 2 đang được sử dụng như một khe cắm tạm thời bổ sung. x
và y
được khởi tạo với các hằng số trong hai opcodes đầu tiên và trong ba 3 opcodes tiếp theo một trao đổi được thực hiện bằng cách sử dụng "tạm thời" khe thứ hai, giống như bạn sẽ làm bằng tay:
tmp = y -- MOVE 2 1
y = x -- MOVE 1 0
x = tmp -- MOVE 0 2
Với cách Lua đã sử dụng một cách tiếp cận khác khi thực hiện một phép chuyển đổi và khởi tạo tĩnh, tôi sẽ không ngạc nhiên nếu bạn có kết quả khác nhau cho nhiều loại khác nhau của nhiều nhiệm vụ (thiết lập các trường bảng có thể sẽ trông rất khác nhau, đặc biệt kể từ đó thứ tự quan trọng do metamethods ...). Chúng tôi sẽ cần phải tìm một phần trong nguồn, nơi bytecode được phát ra là 100% chắc chắn mặc dù. Và như tôi đã đề cập trước đây, tất cả điều này có thể khác nhau giữa phiên bản Lua và triển khai, đặc biệt nếu bạn nhìn vào LuaJIT vs PUC Lua.
Bạn có ý nghĩa gì bởi "công việc thực sự"? Cuốn sách * giải thích * cách nó hoạt động. Bạn đang tìm gì hơn? –