Tôi là người dẫn đầu cho Bitfighter và chúng tôi đang sử dụng Lua làm ngôn ngữ kịch bản để cho phép người chơi lập trình các rô-bốt tùy chỉnh của riêng họ.Khai báo các biến và phạm vi câu hỏi cho Lua
Trong Lua, bạn không cần khai báo biến, và tất cả biến mặc định phạm vi toàn cầu, trừ khi được khai báo khác. Điều này dẫn đến một số vấn đề. Đi đoạn sau, ví dụ:
loc = bot:getLoc()
items = bot:findItems(ShipType) -- Find a Ship
minDist = 999999
found = false
for indx, item in ipairs(items) do
local d = loc:distSquared(item:getLoc())
if(d < minDist) then
closestItem = item
minDist = d
end
end
if(closestItem != nil) then
firingAngle = getFiringSolution(closestItem)
end
Trong đoạn này, nếu findItems() trả về không có ứng cử viên, sau đó closestItem sẽ vẫn tham khảo bất cứ tàu nó tìm thấy thời gian qua xung quanh, và trong thời gian can thiệp, con tàu có thể đã bị giết. Nếu con tàu bị giết, nó không còn tồn tại nữa, và getFiringSolution() sẽ thất bại.
Bạn có phát hiện sự cố không? Vâng, không phải người dùng của tôi cũng vậy. Đó là tinh tế, nhưng với hiệu ứng ấn tượng.
Một giải pháp sẽ là yêu cầu tất cả các biến được khai báo và cho tất cả các biến được đặt mặc định thành phạm vi cục bộ. Mặc dù sự thay đổi đó sẽ không làm cho các lập trình viên không thể tham chiếu đến các đối tượng không còn tồn tại, nó sẽ làm cho việc vô tình trở nên khó khăn hơn.
Có cách nào để yêu cầu Lua đặt mặc định tất cả các biến thành phạm vi địa phương và/hoặc yêu cầu chúng được khai báo không? Tôi biết một số ngôn ngữ khác (ví dụ: Perl) có tùy chọn này.
Cảm ơn!
Rất nhiều câu trả lời hay tại đây, cảm ơn!
Tôi đã quyết định sử dụng phiên bản sửa đổi nhỏ của mô-đun Lua 'nghiêm ngặt'. Điều này dường như đưa tôi đến nơi tôi muốn đi, và tôi sẽ hack nó một chút để cải thiện các thông điệp và làm cho chúng phù hợp hơn với bối cảnh cụ thể của tôi.
BTW, bạn có bất kỳ lý do chính đáng nào để đặt thêm dấu ngoặc ôm trong câu lệnh if của bạn không? –
Vâng, trước khi bạn đặt ra câu hỏi tôi đã trả lời rằng họ đã được yêu cầu. Nhưng bây giờ tôi phải trả lời rằng bỏ qua các parens chỉ có vẻ sai với tôi! – Watusimoto
Đó là sở thích cá nhân của khóa học. Nhưng điều quan trọng cần nhớ là Lua không phải là C hay Pascal hay gì cả. Lua là Lua và sử dụng nó một cách hiệu quả, bạn phải sử dụng nó như nó là, không phải là nếu nó là một số người nghèo thay thế cho ngôn ngữ lập trình khác. Tôi đã tìm thấy rằng "cú pháp có vẻ sai" những điều giúp đưa Lua vào một phần bộ não của tôi khác biệt với C++ và các ngôn ngữ khác mà tôi biết. Tóm lại, ý kiến của tôi là: nếu nó được viết bằng Lua, hãy viết nó theo cách Lua! :-) –