Thay vì sử dụng danh sách dài các đối số trong định nghĩa chức năng của tôi, tôi thích để vượt qua một vài thông số cố định và một bảng 'params thêm' như thế này:LUA: Tìm kiếm phương tiện hiệu quả và không bị lỗi gán đối số mặc định
function:doit(text, params)
end
Điều này thật tuyệt vì nó cho phép tôi thêm các thông số mới có tên sau mà không vi phạm các cuộc gọi cũ.
Vấn đề tôi đang trải qua xảy ra khi tôi cố gắng để buộc giá trị mặc định cho một số các params:
function:doit(text, params)
local font = params.font or native.systemBold
local fontSize = params.fontSize or 24
local emboss = params.emboss or true
-- ...
end
Đoạn mã trên hoạt động tốt trong mọi trường hợp, trừ trường hợp tôi đã trôi qua trong 'false' cho chạm khắc :
doit("Test text", { fontSize = 32, emboss = false })
Mã trên sẽ cho kết quả hiển thị là đúng khi tôi thực sự muốn sai.
Để rõ ràng, điều tôi muốn là cho giá trị không phải NIL đầu tiên được gán cho hình chữ nhật, thay vào đó tôi nhận được giá trị không sai và không phải là NIL đầu tiên.
Để chống lại vấn đề này tôi đã viết một đoạn mã nhỏ để tìm giá trị phi NIL đầu tiên trong một bảng và trả lại rằng:
function firstNotNil(...)
for i = 1, #arg do
local theArg = arg[i]
if(theArg ~= nil) then return theArg end
end
return nil
end
Sử dụng chức năng này, tôi sẽ viết lại sự phân công chạm khắc như sau:
local emboss = firstNotNil(params.emboss, true)
Bây giờ, điều này chắc chắn hoạt động, nhưng có vẻ như không hiệu quả và trên đầu. Tôi hy vọng có một cách nhỏ gọn hơn để làm điều này.
Xin lưu ý: Tôi tìm thấy cấu trúc ruby này trông đầy hứa hẹn và tôi hy vọng lua có một cái gì đó giống như nó:
[c,b,a].detect { |i| i > 0 } -- Assign first non-zero in order: c,b,a
Bạn đã xem [câu hỏi trước này] (http://stackoverflow.com/questions/6022519/define-default-values-for-function-arguments) về một chủ đề tương tự chưa? – hugomg
"có vẻ như không hiệu quả" Bạn có dữ liệu lược tả thực tế để sao lưu điều này hay đây chỉ là một trong những điều ruột mà bạn không nên lo lắng? –