Nếu bạn muốn các đối số được đặt tên và giá trị mặc định như PHP hoặc Python, bạn có thể gọi hàm của mình bằng một phương thức khởi tạo bảng:
myfunction{a,b=3,c=2}
(Điều này được thấy ở nhiều nơi trong Lua, chẳng hạn như các dạng nâng cao của mô-đun giao thức và trình xây dựng của LuaSocket trong IUPLua .)
Bản thân hàm có thể có một chữ ký như sau:
function myfunction(t)
setmetatable(t,{__index={b=7, c=5}})
local a, b, c =
t[1] or t.a,
t[2] or t.b,
t[3] or t.c
end
Bất kỳ giá trị nào bị thiếu trong bảng tham số sẽ được lấy từ __index
bảng trong khả năng đo được của nó (xem tài liệu về bảng tham số ).
Tất nhiên, các kiểu tham số nâng cao hơn có thể sử dụng các hàm và hàm tạo bảng - bạn có thể viết bất cứ thứ gì bạn cần. Ví dụ, đây là một hàm tạo một hàm lấy bảng đối số có tên hoặc vị trí từ bảng xác định tên tham số và giá trị mặc định và một hàm lấy danh sách đối số thông thường.
Là một tính năng không cấp ngôn ngữ, các lệnh gọi như vậy có thể được thay đổi để cung cấp các hành vi và ngữ nghĩa mới:
- Các biến có thể được tạo để chấp nhận nhiều hơn một tên
- Các biến vị trí và biến từ khóa có thể được xen kẽ - và việc xác định cả hai có thể ưu tiên cho một trong hai (hoặc gây ra lỗi)
- Có thể tạo các biến không có vị trí chỉ từ khóa, cũng như các biến chỉ vị trí không tên
- Cấu trúc bảng khá dài có thể được thực hiện bằng cách phân tích cú pháp một chuỗi
- Danh sách đối số có thể được sử dụng nguyên văn nếu hàm được gọi với thứ gì đó không phải là 1 bảng
Một số hàm hữu ích để viết trình dịch đối số là unpack
(chuyển sang phiên bản table.unpack
5.2), setfenv
(không dùng nữa trong phiên bản 5.2 với _ENV
cấu trúc mới ) và select
(trả về một giá trị duy nhất từ danh sách đối số nhất định hoặc độ dài của danh sách với '#'
).