0Pricing
Lua Academy · Lekcja

Funkcje jako wartości

Zapisze Pan/Pani funkcje i przekaże je dalej.

Funkcje jako wartości to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.

Funkcje są wartościami pierwszej klasy

W Lua funkcje są wartościami pierwszej klasy. Oznacza to, że funkcja jest po prostu danymi: można przechowywać ją w zmiennej, przekazywać do innej funkcji, zwracać ją i umieszczać w tabeli.

Ta jedna koncepcja jest podstawą całego programowania funkcyjnego. Gdy traktuje się funkcje tak samo jak liczby czy napisy, można tworzyć elastyczne narzędzia wielokrotnego użytku.

Przechowywanie funkcji w zmiennej

Nazwa nadana funkcji jest w rzeczywistości tylko zmienną przechowującą wartość funkcji. Można swobodnie przypisać tę wartość do innej zmiennej.

Obie poniższe nazwy wskazują tę samą funkcję, więc wywołanie dowolnej z nich uruchomi ten sam kod.

local function greet(name)
  return "Hello, " .. name
end

local hi = greet
print(greet("Ada"))
print(hi("Lin"))

Funkcje anonimowe

Do utworzenia funkcji nie jest potrzebna nazwa. Funkcję anonimową zapisuje się za pomocą składni function ... end i używa bezpośrednio jako wartości.

Przypisanie jej do zmiennej lokalnej działa tak samo jak zwykła definicja funkcji, ale jest zapisane bezpośrednio w miejscu użycia.

local square = function(x)
  return x * x
end

print(square(5))
print(square(9))

Funkcje jako argumenty

Ponieważ funkcje są wartościami, można przekazywać je do innych funkcji. Funkcja przyjmująca inną funkcję jest nazywana funkcją wyższego rzędu.

W tym przykładzie apply nie wie, jaką pracę ma wykonać, dopóki nie przekażesz jej funkcji do uruchomienia.

local function apply(f, x)
  return f(x)
end

local function double(n) return n * 2 end

print(apply(double, 10))
print(apply(function(n) return n + 1 end, 10))

Zwracanie funkcji

Funkcja może zwracać inną funkcję. Dzięki temu można tworzyć funkcje na żądanie, skonfigurowane za pomocą przekazanych argumentów.

Poniżej multiplier za każdym razem tworzy zupełnie nową funkcję, która pamięta przekazany jej współczynnik.

local function multiplier(factor)
  return function(x)
    return x * factor
  end
end

local triple = multiplier(3)
print(triple(4))
print(multiplier(10)(5))

Domknięcia przechwytują zmienne

Gdy zwrócona funkcja korzysta ze zmiennej lokalnej z funkcji obejmującej, przechwytuje tę zmienną. Połączenie funkcji i przechwyconych przez nią zmiennych nazywa się domknięciem.

Przechwycona zmienna factor pozostaje aktywna tak długo, jak długo istnieje domknięcie, nawet po zakończeniu zewnętrznego wywołania.

local function counter()
  local n = 0
  return function()
    n = n + 1
    return n
  end
end

local next = counter()
print(next())
print(next())
print(next())

Funkcje w tabelach

Tabele mogą przechowywać funkcje tak samo jak każdą inną wartość. W ten sposób Lua tworzy moduły i obiekty: tabela przyporządkowuje nazwy wartościom funkcji.

Możesz wyszukać funkcję za pomocą klucza i wywołać ją, a nawet iterować po tabeli operacji.

local ops = {
  add = function(a, b) return a + b end,
  sub = function(a, b) return a - b end
}

print(ops.add(2, 3))
print(ops["sub"](9, 4))

Tabela strategii

Przechowywanie funkcji w tabeli pozwala wybierać zachowanie w czasie działania programu na podstawie klucza. Zastępuje to długie ciągi instrukcji if-else przejrzystym wyszukiwaniem.

Wybieranie operacji po nazwie sprawia, że kod wywołujący jest krótki i łatwo można go rozszerzać o nowe klucze.

local dispatch = {
  upper = string.upper,
  lower = string.lower,
  rev = string.reverse
}

local function run(name, s)
  return dispatch[name](s)
end

print(run("upper", "lua"))
print(run("rev", "lua"))

Funkcje zwrotne

Funkcja zwrotna to funkcja przekazana po to, aby można ją było wywołać później. Biblioteka standardowa Lua korzysta z tego schematu — na przykład table.sort przyjmuje funkcję porównującą.

Funkcja zwrotna określa regułę, a biblioteka zajmuje się iterowaniem i przestawianiem elementów.

local nums = {5, 2, 9, 1}
table.sort(nums, function(a, b)
  return a > b
end)

print(table.concat(nums, ", "))

Funkcje mają własną tożsamość

Każda wartość funkcji jest odrębnym obiektem. Dwa osobne literały funkcji nigdy nie są równe, nawet jeśli zawierają ten sam kod.

Jednak pojedyncza funkcja przechowywana w dwóch zmiennych jest uznawana za równą samej sobie, ponieważ obie nazwy wskazują tę samą wartość.

local f = function() return 1 end
local g = function() return 1 end
local h = f

print(f == g)
print(f == h)

Dlaczego to ma znaczenie

Traktowanie funkcji jako wartości pozwala raz napisać uniwersalne narzędzia, a następnie dostosowywać je za pomocą przekazywanych funkcji. Mapowanie, filtrowanie, częściowa aplikacja i kompozycja opierają się właśnie na tej koncepcji.

W dalszej części kursu zbudujemy praktyczne schematy wykorzystujące funkcje pierwszej klasy i domknięcia.

Szybki test

Sprawdź swoją wiedzę na temat funkcji pierwszej klasy w Lua.

Podsumowanie

Funkcje w Lua są wartościami pierwszej klasy: można przechowywać je w zmiennych i tabelach, przekazywać jako argumenty oraz zwracać z innych funkcji.

Zwrócenie funkcji, która przechwytuje zmienne lokalne funkcji obejmującej, tworzy domknięcie. Te koncepcje są podstawą wszystkich kolejnych schematów programowania funkcyjnego.

Często zadawane pytania

Czy lekcja „Funkcje jako wartości” jest bezpłatna?

Tak — pełny tekst „Funkcje jako wartości” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Funkcje jako wartości”?

Zapisze Pan/Pani funkcje i przekaże je dalej. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Lua Academy?

Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Funkcje jako wartości”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?

Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Funkcje jako wartości
  2. map, filter, reduce
  3. Częściowe zastosowanie
  4. Komponowanie funkcji
← Powrót do Lua Academy