Lua – funkcje
Pewnie wiele razy spotkaliście się z określeniem funkcja, czy to na matematyce czy gdzieś indziej. Tak naprawdę warto sobie powiedzieć co to jest ta funkcja (przynajmniej w Lua). Tak jak w innych językach programowania, funkcja w Lua pełni rolę segmentu, który po wywołaniu wykonuje dane instrukcje. Zaoszczędza to miejsca w skrypcie, gdyż czasem zdarza się, że musimy zadeklarować segment instrukcji więcej niż jeden raz. Funkcja może pobierać wartości liczbowe, wartości boolean, tablice oraz ciągi znaków. Deklaracja funkcji wygląda banalnie:
Kod:
function HelloWorld()
return print('Hello World!')
end
Jak widać deklaracja funkcji składa się z dwóch słów kluczowych - słowa function i nazwy funkcji. Słowo function przekazuje interpretatorowi informacje, iż dany obszar pamięci ma zostać zadeklarowany jako funkcja. Nazwa funkcji musi być jednym wyrazem, można używać znaków '_','-' itd. Musimy pamiętać o wielkościach znaków, gdyż w Lua w przeciwieństwie do Pascala ma to znaczenie. Podczas gospodarowania nazwy funkcji trzeba także uważać, aby nie nadać jej nazwy już wbudowanego modułu (np. end, return, for). Funkcja nie musi, ale może pobierać dane wartości.
function Mnoz(n)
return n * 5
for i = 1, 5 do
print(Mnoz(i))
Pobraną wartość możemy używać na terenie funkcji, która ją pobrała. W tym przypadku pobraliśmy wartość do zmiennej 'n'. Jak widzimy pobraną wartość możemy dowolnie wykorzystywać w funkcji, w tym wypadku pomnożyliśmy ją przez 5. Jednak nasuwa się pytanie - co to jest return? Return informuje interpretator o tym, że dana funkcja będzie miała zamiar zwracać dowolną wartość. Dzięki temu funkcji możemy używać przykładowo w połączeniu z łańcuchem znaków. Return może zwracać wartości liczbowe, tablice, wartości boolean oraz ciągi znaków. Możemy również deklarować funkcje lokalne. Będziemy ich mogli używać jedynie w pliku ze skryptem, w którym została zadeklarowana. Po "doczepieniu" jako biblioteka do drugiego skryptu, zmienna lokalna nie będzie mogła zostać tam wykorzystana.
local function HelloWorld()
HelloWorld()
W kodzie funkcję wywołujemy poprzez napisanie jej nazwy (jak już nadmieniłem - wielkość znaków ma znaczenie) i nadanie jej parametrów (parametry funkcji nadajemy w nawiasie, tuż po jej nazwie). Taka deklaracja funkcji jest również poprawna:
HelloWorld = function()
Lekcja skończona. Mam nadzieję, że się podobało . Jak zwykle - czekam na komentarze, krytykę i sugestie.
Autor: Simone
http://forum.tibia.tv/showthread.php?t=28075
Lua - pisanie własnych funkcji
W pewnym momencie bycia skrypterem pojawia się problem pisania własnych funkcji lub nawet całych bibliotek. Na początku zacznijmy od tego, że musimy wiedzieć co takowa funkcja ma "robić". Musimy pamiętać o tym, że Lua posiada też pęk funkcji wbudowanych i niektóre po dłuższym zastanowieniu możemy wykorzystać zamiast funkcji, którą mamy zamiar napisać. Co warto wiedzieć - każda zadeklarowana funkcja w jakiś sposób zwiększa zużycie procesora, dlatego też nie powinniśmy deklarować ogromu niepotrzebnych funkcji, gdyż nasz program może powodować niepożądane obciążenie komputera. Kolejną rzeczą, może trochę mniej ważną są dwa rodzaje funkcji. Możemy tworzyć funkcjelokalne i globalne. Pokrótce omówię różnicę między nimi.Funkcja lokalna - Zakres lokalny funkcji, czyli ograniczenie działania do skryptu, w którym została zadeklarowana. Mniejsze zużycie pamięci.Funkcja globalna - Zakres globalny funkcji, czyli możliwość jej wykonania w innych skryptach, mimo faktu, że została zadeklarowana w innym pliku (najczęściej tzw. libie [bibliotece]). Większe zużycie pamięci.Przy znajomości tego podziału, możemy zabrać się już za konstruowanie funkcji. Tak więc po wybraniu interesującego nas typu funkcji tworzymy taką deklarację:
lua Kod:
local function firstFunction() -- jak łatwo się domyślić przedrostek "local" ustala, że funkcja jest interpretowana jako lokalna print("Hello World!") -- przykładowa instrukcja wykonywana wewnątrz funkcjiend -- zakończenie funkcji słowem "end" (ważne!)
Na wymagane elementy funkcji tak naprawdę składają się tylko słowa function oraz end. W funkcji tak naprawdę możemy umieszczać wszystkie odwołania języka Lua. Musimy jednak pamiętać o regułach, takich jak na przykład "end" na końcu wyrażeń warunkowych. Opcjonalnie słowo function może posiadać przedrostek local, który to daje interpretatorowi do zrozumienia, że dana funkcja będzie typu lokalnego, logicznie, funkcja bez tego przedrostka będzie uważana za funkcję globalną. Jeżeli chcemy rozbudować naszą funkcję, to musimy zadeklarować obmyślone przez nas algorytmy wewnątrz jej deklaracji. Przykładowo chcemy sobie napisać funkcję, która będzie wyliczać silnię z podanej liczby.
local function silnia(liczba) -- deklaracja funkcji i nadanie jej typu lokalnego. local wartosc = 1 -- deklaracja zmiennej lokalnej w funkcji. if liczba > 0 then -- wyrażenie warunkowe. for i = 1, liczba do -- pętla for (iteracja). wartosc = wartosc * i -- zwiększanie wartości zmiennej. end -- koniec pętli for. else -- w innym przypadku (wyrażenie warunkowe). return 0 -- zwróć liczbę 0. end -- koniec wyrażenia warunkowego. return wartosc -- zwróć wartość zmiennej "wartosc".end -- koniec funkcji.print(silnia(6)) -- wyświetlanie zwróconej przez funkcje wartości (matematycznie dobrze wyliczone bo 6! = 1 * 2 * 3 * 4 * 5 * 6 = 720).
Jak widzimy w funkcji wszystko deklarujemy podobnie jak w reszcie kodu (poza deklaracjami funkcji).Jak już pewnie wiesz słowo return odpowiada za zwracanie wartości funkcji. Mogą to być różne typy (nawet połączone ze sobą, co ciekawostka bo np. w C++ w deklaracji określamy również typ zwracanych danych.), oto krótka lista (a tak właściwie przypomnienie) o typach danych, które mogą być zwrócone przez funkcje.
liczbowe - zwracanym typem danych mogą być wszystkie liczby rzeczywiste.
ciągi znaków - zwracanym typem danych mogą być wszelkie ciągi znaków.
boolean - true/false (prawda/fałsz). zwracanym typem danych mogą być wartości logiczne.
tablice - zwracanym typem danych mogą być całe tablice wraz z zadeklarowanymi w nich wartościami.
funkcje - zwracanym typem danych mogą być całe funkcje, lub ich wywoływacze.
nil - zwracanym typ danych może nie mieć wartości, dzięki czemu przybiera wartość nil.
Odczytując zwracaną wartość naszej funkcji nie będziemy zazwyczaj uznawali wszystkich możliwych typów danych, które funkcja może zwrócić, więc warto się przy tym za bardzo nie rozwodzić.Funkcję, którą stworzymy możemy wywołać tak samo jak wywołujemy wszystkie inne (czyli przez podanie jej nazwy oraz w okrągłym nawiasie wartości dla atrybutów [o ile takie są]).Przy tworzeniu własnych funkcji warto także zapoznać się z paroma definicjami, które na pewno kiedyś się przydadzą:
rekurencja - algorytm zazwyczaj umieszczany w funkcji, który ma zadanie wykonywanie jej samej przez tą funkcje do czasu błędu lub otrzymania wyniku.
iteracja - z góry określona liczba wykonania algorytmu.
praca równoległa - równoczesne wykonywaniu kilku algorytmów lub obliczeń matematycznych, które to instancje wymieniają się danymi.
obiektowość - dział programowania, w którym elementy łączy się tzw. klasami.
Tworząc własną funkcję możemy wykorzystać wiele funkcjonalnych bajerów. Możemy tworzyć klasy podobne (jednak o mniejszych możliwościach) jak te w obiektowych językach programowania. Możemy sobie zasymulować nową klasę na przykład takim zapisem:
local Account = {} -- deklaracja nowego obiektu Account.__ = Account -- włączenie indexu obiektu Accout do tego obiektu function Account:new (balance) ...
avaster12