Jestem głównym programistą dla Bitfighter i używamy Lua jako języka skryptowego, aby umożliwić graczom programowanie własnych niestandardowych statków-robotów.Zgłaszanie zmiennych i pytań dotyczących zakresu Lua
W Lua nie trzeba deklarować zmiennych, a wszystkie zmienne mają domyślny zasięg globalny, chyba że zadeklarowano inaczej. To prowadzi do pewnych problemów. Weźmy następujący fragment, na przykład:
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
W tym fragmencie, jeśli findItems() zwraca żadnych kandydatów, wówczas closestItem nadal będą odnosić się do tego, co statek okaże ostatni raz dokoła, aw czasie interwencyjnym, że statek mógł zostać zabity. Jeśli statek zostanie zabity, przestanie istnieć, a getFiringSolution() zawiedzie.
Czy zauważyłeś problem? Cóż, nie będą też moi użytkownicy. Jest subtelny, ale z dramatycznym efektem.
Jednym z rozwiązań może być wymaganie zadeklarowania wszystkich zmiennych oraz domyślnego ustawienia wszystkich zmiennych na zakres lokalny. Chociaż zmiana ta nie uniemożliwiłaby programistom odnoszenia się do obiektów, które już nie istnieją, utrudniłoby to nieumyślne wykonanie.
Czy jest jakiś sposób, aby powiedzieć Lua, aby domyślnie wszystkie vary na zasięg lokalny, i/lub wymagać, aby zostały zadeklarowane? Wiem, że niektóre inne języki (np. Perl) mają tę opcję.
Dzięki!
Wiele dobrych odpowiedzi tutaj, dzięki!
Postanowiłem wybrać nieco zmodyfikowaną wersję modułu "ścisłego" Lua. To wydaje mi się, że chcę tam, gdzie chcę, i zhakuję ją trochę, aby poprawić wiadomości i uczynić je bardziej odpowiednimi dla mojego konkretnego kontekstu.
BTW, czy masz jakiś dobry powód, aby umieścić dodatkowe szelki wewnątrz swoich instrukcji if? –
Cóż, zanim postawiłeś pytanie, odpowiedziałbym, że są one wymagane. Ale teraz muszę odpowiedzieć, że pomijanie parensów wygląda mi nie tak! – Watusimoto
Oczywiście jest to osobista preferencja. Ale ważne jest, aby pamiętać, że Lua to nie C, Pascal czy cokolwiek innego. Lua to Lua i aby skutecznie z niego korzystać, musisz używać go takim, jaki jest, a nie tak, jakby był słabym zamiennikiem innego języka programowania. Odkryłem, że taka "składnia wygląda źle" sprawia, że Lua staje się częścią mojego mózgu, odmienną od C++ i innych znanych mi języków. Krótko mówiąc, moja opinia brzmi: jeśli jest napisane w Lua, napisz to na sposób Lua! :-) –