02: Lua – instrukcje sterujące, funkcje

Instrukcje sterujące pozwalają nam na kontrolowanie przebiegu programu. W zależności od np. wartości zmiennej możemy wykonać inny kawałek kodu.

If … then … end

Pierwszą podstawową instrukcją jest if. Sprawdza ona spełnienie warunku – a jest nim wyrażenie logiczne. Gdy warunek jest prawdziwy, następuje wykonanie kodu za słowem then, gdy nie jest spełniony (czyli jest fałszywy), przechodzi do następnej instrukcji. [more]Prosty przykład:

x =1
if x > 1 then
    print("x jest większy od 1")
elseif x == 1 then
    print("x równa się 1")
else
    print("x jest mniejszy od 1")
end

Instrukcji elseif może być kilka i będą one sprawdzane w kolejności w jakiej występują, aż do tej w której jest spełniony warunek. Instrukcja else może być tylko jedna i wykonana jest tylko wtedy, gdy w poprzednich if oraz elseif nigdzie nie został spełniony warunek.

while … do … end

Ten rodzaj pętli polega na wykonywaniu kodu tak długo jak warunek będzie spełniony – sprawdzanie następuje przed wykonaniem.

i = 5
while i>0 do
    print("Wartość zmiennej i wynosi teraz: " .. i)
    i = i - 1
end

repeat … until …

Tu jest zupełnie odwrotnie – kod jest wykonywany tyle razy, aż warunek stanie się prawdziwy. Przykład dający wynik identyczny jak wyżej:

i = 5
repeat
    print("Wartość zmiennej i wynosi teraz:" .. i)
    i = i - 1
until i == 0

Uwaga: najpierw wykonany jest kod, później sprawdzony warunek.

for … do … end

W Lua pętla tego typu ma dwa rodzaje. Numeryczny i ogólny. Zaczniemy od tego pierwszego.

Numeryczna

for i=1, 5, 1 do
    print("Wartość zmiennej i wynosi teraz:" .. i)
end

Zastanawiasz się pewnie co oznaczają te cyferki w i=1, 5, 1 (ta ostatnia nie jest niezbędna w tym przypadku) – idąc po kolei: pierwsza liczba oznacza początkową wartość zmiennej i, druga oznacza docelową wartość (niekoniecznie maksymalna), trzecia określa tempo i kierunek zmian. Innym przykładem będzie:

for i=10, -10, -4 do
    print("Wartość zmiennej i wynosi teraz:" .. i)
end

Ogólna

Odnosi się ona do tablic, dlatego dokładniej zostanie przedstawiona później. Przykład:

a = { 1, 2, 3 }
a.text = "Jasiu"
for i, v in pairs(a) do
    print("Element " .. i .. " tablicy ma wartość: " .. v)
end

Dla ciekawskich: funkcja pairs zwraca kolejny element tablicy

break

Instrukcja break przerywa wykonywanie pętli.

for i=1, 10 do
    print(i)
    if i == 4 then
        break
    end
end

Funkcje

Teraz najważniejsze – funkcje definiowane przez użytkownika. Są to „podprogramy”. Za ich pomocą zdefiniujemy nowe instrukcje. Dzięki nim unikniemy powtarzania kodu w obrębie naszego programu, co ułatwia późniejsze zmiany i poprawki niewymagające zmiany w stu miejscach.

-- moja pierwsza funkcja!
function przywitanie()
    print("Cześć!")
end

Wywołując przywitanie() zostanie napisane „Cześć!”.
Świetnie, ale co mi po funkcji bez argumentów? Aby nasza funkcja odbierała argumenty musimy w nawiasy wpisać nazwy tych argumentów, które będą później wykorzystane. Kolejny przykład:

function poleTrojkata(a, h)
    print( 1/2 * a * h )
end

Wywołanie poleTrojkata(10, 4) powinno zwrócić powierzchnię tej figury o podanych wymiarach, w tym przypadku 20.
Jednak wciąż nie jest to idealne. Funkcja działa, ma nawet sens, ale czemu nie mogę z jej wynikiem nic zrobić? Wszystko spowodowane tym, że używaliśmy w funkcji polecenia print, które drukuje wiadomość na ekran. Bardziej przydatne jest return, które po prostu zwraca nam jakąś zmienną.

function poleTrojkata(a, h)
    return 0.5 * a * h
end

function bokTrojkata(pole, h)
    return 2 * pole / h
end

print( poleTrojkata(10, 4) )
print( bokTrojkata(poleTrojkata(10, 4), 4) )

Zmienne lokalne

Czasem w kilku miejscach pojawi nam się zmienna o tej samej nazwie. Zmienne lokalne działają tylko w obrębie funkcji, nie w całym programie, dzięki czemu nie zmieniamy jej ogólnej wartości. Zrozumiemy to w przykładzie:

a = 10
function wypisz()
    local a
    a = 20
    print(a)
end

print(a)
wypisz()
print(a)

Jak widać poza funkcją wartość zmiennej pozostała niezmieniona.

[tag]lua, programowanie, poradnik, instrukcje, zmienne, lokalne, funkcje, pętla, while, for, break, repeat, until, if, elseif, else[/tag]