Funktioner i Lua

I denna lektion lär du dig hur du skapar och använder funktioner i Lua, vilket hjälper dig att skriva kod som går att återanvända.

Vad är funktioner?

Funktioner är block av kod som kan anropas från olika ställen i programmet. De hjälper oss att:

  • Organisera vår kod bättre
  • Återanvända kod istället för att upprepa samma sak
  • Dela upp program i mindre, enklare delar

I Lua är funktioner "first-class values", vilket betyder att de kan sparas i variabler, skickas som argument och returneras från andra funktioner.

Skapa en funktion

I Lua finns flera sätt att definiera funktioner. Det enklaste är:

-- Definiera en enkel funktion
function hälsa()
    print("Hej från Lua!")
end

-- Anropa funktionen
hälsa()  -- Skriver ut: Hej från Lua!

Funktioner med parametrar

Du kan också skapa funktioner som tar emot parametrar:

-- Funktion med parametrar
function hälsaPerson(namn)
    print("Hej " .. namn .. "!")
end

-- Anropa funktionen med argument
hälsaPerson("Lisa")  -- Skriver ut: Hej Lisa!
hälsaPerson("Karl")  -- Skriver ut: Hej Karl!

Returnera värden

Funktioner kan returnera värden som kan användas senare i koden:

-- Funktion som returnerar ett värde
function addera(a, b)
    return a + b
end

-- Använd resultatet från funktionen
local summa = addera(5, 3)
print("Summan är " .. summa)  -- Skriver ut: Summan är 8

-- Du kan också använda resultatet direkt
print("10 + 20 = " .. addera(10, 20))  -- Skriver ut: 10 + 20 = 30

Lokala och globala funktioner

Liksom variabler kan funktioner vara lokala eller globala:

-- Global funktion (tillgänglig överallt)
function globalFunktion()
    print("Detta är en global funktion")
end

-- Lokal funktion (endast tillgänglig inom ett visst område)
local function lokalFunktion()
    print("Detta är en lokal funktion")
end

Det är ofta en bra vana att göra funktioner lokala när de bara används i en fil eller ett begränsat område.

Alternativ funktionssyntax

Funktioner kan också definieras som variabler:

-- Detta är samma sak som exemplet ovan, men med annan syntax
local lokalFunktion = function()
    print("Detta är en lokal funktion")
end

-- När du anropar den är det samma
lokalFunktion()

Funktioner med flera returvärden

I Lua kan funktioner returnera flera värden, vilket är mycket praktiskt:

-- Funktion som returnerar flera värden
function räknaMatte(a, b)
    local summa = a + b
    local skillnad = a - b
    local produkt = a * b
    local kvot = a / b
    
    return summa, skillnad, produkt, kvot
end

-- Hämta alla värden
local s, d, p, k = räknaMatte(10, 2)
print("Summa: " .. s)       -- Skriver ut: Summa: 12
print("Skillnad: " .. d)    -- Skriver ut: Skillnad: 8
print("Produkt: " .. p)     -- Skriver ut: Produkt: 20
print("Kvot: " .. k)        -- Skriver ut: Kvot: 5

-- Du kan också hämta bara de första värdena
local bara_summa = räknaMatte(10, 2)
print("Bara summan: " .. bara_summa)  -- Skriver ut: Bara summan: 12

Varargs - Funktioner med variabelt antal parametrar

Ibland behöver du en funktion som kan ta emot ett varierande antal parametrar. Lua stödjer detta med ... (tre punkter):

-- Funktion med varierande antal parametrar
function summaAvAllt(...)
    local summa = 0
    -- arg är en speciell "tabell" med alla parametrar
    local arg = {...}
    
    for i, värde in ipairs(arg) do
        summa = summa + värde
    end
    
    return summa
end

print(summaAvAllt(1, 2, 3))       -- Skriver ut: 6
print(summaAvAllt(10, 20, 30, 40)) -- Skriver ut: 100
Tips: ipairs används för att loopa genom en tabell i ordning. Läs mer om tabeller i nästa lektion!

Övningar

Övning 1: Temperaturomvandlare

Skriv två funktioner för att konvertera temperaturer:

  1. En funktion som konverterar från Celsius till Fahrenheit (formel: F = C * 9/5 + 32)
  2. En funktion som konverterar från Fahrenheit till Celsius (formel: C = (F - 32) * 5/9)
  3. Testa funktionerna med olika temperaturer och skriv ut resultaten

Lösningsförslag:

-- Temperaturomvandlare

-- Celsius till Fahrenheit
function celsiusTillFahrenheit(celsius)
    return celsius * 9/5 + 32
end

-- Fahrenheit till Celsius
function fahrenheitTillCelsius(fahrenheit)
    return (fahrenheit - 32) * 5/9
end

-- Testa funktionerna
local temperaturC = 25
local temperaturF = celsiusTillFahrenheit(temperaturC)
print(temperaturC .. "°C är " .. temperaturF .. "°F")

local nyTemperaturC = fahrenheitTillCelsius(temperaturF)
print(temperaturF .. "°F är " .. nyTemperaturC .. "°C")

-- Testa med fler temperaturer
print("0°C är " .. celsiusTillFahrenheit(0) .. "°F")
print("100°C är " .. celsiusTillFahrenheit(100) .. "°F")
print("32°F är " .. fahrenheitTillCelsius(32) .. "°C")
print("212°F är " .. fahrenheitTillCelsius(212) .. "°C")

Övning 2: Enkel miniräknare

Skapa en miniräknare med hjälp av funktioner:

  1. Definiera fyra lokala funktioner: addera, subtrahera, multiplicera och dividera
  2. Skapa en huvudfunktion beräkna som tar tre parametrar: två tal och en operator ("+", "-", "*", "/")
  3. Beroende på operatorn ska funktionen anropa rätt matematisk funktion och returnera resultatet
  4. Testa din miniräknare med olika tal och operatorer

Lösningsförslag:

-- Miniräknare med funktioner

-- Definiera matematiska funktioner
local function addera(a, b)
    return a + b
end

local function subtrahera(a, b)
    return a - b
end

local function multiplicera(a, b)
    return a * b
end

local function dividera(a, b)
    if b == 0 then
        return "Fel: Division med noll"
    end
    return a / b
end

-- Huvudfunktion för miniräknaren
function beräkna(tal1, operator, tal2)
    if operator == "+" then
        return addera(tal1, tal2)
    elseif operator == "-" then
        return subtrahera(tal1, tal2)
    elseif operator == "*" then
        return multiplicera(tal1, tal2)
    elseif operator == "/" then
        return dividera(tal1, tal2)
    else
        return "Ogiltig operator"
    end
end

-- Testa miniräknaren
print("5 + 3 = " .. beräkna(5, "+", 3))
print("10 - 4 = " .. beräkna(10, "-", 4))
print("6 * 7 = " .. beräkna(6, "*", 7))
print("20 / 5 = " .. beräkna(20, "/", 5))
print("10 / 0 = " .. beräkna(10, "/", 0))
print("8 ? 2 = " .. beräkna(8, "?", 2))