Lua Academy · leksjon

Deklarere variabler i Lua

Forstå forskjellen mellom globale og lokale variabler, samt navnekonvensjoner.

Leksjon 2 av 412 trinn

Deklarere variabler i Lua er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Lua Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Globale kontra lokale variabler

I Lua er variabler globale som standard. Hvis De skriver x = 10 uten nøkkelordet local, opprettes en global variabel som er tilgjengelig overalt. Hvis De bruker local x = 10, begrenses variabelen til den gjeldende blokken og de nestede blokkene.

Foretrekk alltid local av hensyn til ytelse og sikkerhet. Det går raskere å få tilgang til en lokal variabel enn en global, fordi globale variabler krever et oppslag i hashtabellen _G.

x = 100          -- global variable
local y = 200    -- local variable

do
  local z = 300  -- block-local
  print(x, y, z) -- 100  200  300
end

print(x, y)      -- 100  200
print(z)         -- nil  (out of scope)

Nøkkelordet local

Nøkkelordet local deklarerer en variabel med omfang i den nærmeste omsluttende blokken: en funksjonskropp, en do...end-blokk, en løkkekropp eller en filchunk. Lokale variabler opprettes på linjen der de deklareres, og slutter å eksistere når blokken avsluttes.

De kan deklarere flere lokale variabler på én linje og initialisere dem samtidig. Lokale variabler som ikke initialiseres, får standardverdien nil.

local a, b, c = 1, 2, 3
print(a, b, c)    -- 1  2  3

local d, e = 10   -- e is nil
print(d, e)       -- 10  nil

local f           -- nil until assigned
f = 42
print(f)          -- 42

Konvensjoner for variabelnavn

Lua-identifikatorer følger disse reglene: De må starte med en bokstav eller understrek, etterfulgt av bokstaver, sifre eller understreker. Lua skiller mellom store og små bokstaver, så Value, value og VALUE er tre forskjellige variabler.

Etter konvensjonen bruker De camelCase eller snake_case for vanlige variabler, UPPER_CASE for konstanter og prefikser private modulfelter med et understrek. Unngå navn med én bokstav, bortsett fra for løkketellere.

local myVariable = 1     -- camelCase
local my_variable = 2    -- snake_case
local MAX_SIZE = 100     -- constant convention
local _private = "hidden" -- private convention

-- Case sensitivity demo
local lua = "lower"
local Lua = "upper"
print(lua, Lua)  -- lower  upper

Den globale tabellen _G

Alle globale variabler i Lua ligger i en spesiell tabell kalt _G. Å skrive x = 10 er det samme som å skrive _G.x = 10. De kan undersøke alle globale variabler ved å iterere over _G, noe som er praktisk ved feilsøking, men farlig i produksjonskode.

I Lua 5.2+ er _ENV den faktiske miljøtabellen, og _G initialiseres slik at den peker på den. Når De forstår dette, kan De sandbokse kode ved å erstatte _ENV.

myGlobal = 42
print(_G.myGlobal)   -- 42

-- Setting via _G is the same as direct assignment
_G.another = "hello"
print(another)        -- hello

-- Counting globals (many built-ins exist)
local count = 0
for k in pairs(_G) do count = count + 1 end
print("Globals:", count)

Flertallsoppdragning

Lua støtter flertallsoppdragning: De kan tilordne flere variabler i én setning. Høyresiden evalueres først, og deretter tilordnes verdiene fra venstre mot høyre. Hvis det er flere variabler enn verdier, får de ekstra variablene nil. Hvis det er flere verdier enn variabler, forkastes de ekstra verdiene.

Dette gjør det enkelt å bytte om på variabler uten en midlertidig variabel.

-- Swap without temp variable
local a, b = 10, 20
a, b = b, a
print(a, b)   -- 20  10

-- More variables than values
local x, y, z = 1, 2
print(x, y, z)  -- 1  2  nil

-- More values than variables
local p, q = 1, 2, 3  -- 3 is discarded
print(p, q)   -- 1  2

Omfang og blokkgrenser

Lua sine blokkavgrensere er: do...end, funksjonskropper, if/elseif/else...end, while...end, repeat...until og for...end. Hver av dem oppretter et nytt omfangsnivå. do...end-blokker er nyttige når De bare vil begrense omfanget uten annen logikk.

En lokal variabel som deklareres i hodet til en for-løkke, har omfang i løkkekroppen – den lekker ikke ut.

for i = 1, 3 do
  local msg = "item " .. i
  print(msg)
end
-- print(i)   -- would be nil, i is gone
-- print(msg) -- would be nil, msg is gone

-- do...end for manual scoping
do
  local temp = expensive_computation or 0
  print(temp)
end
-- temp is nil here

Konstanter: local-konvensjonen

Lua har ikke noe innebygd nøkkelord const. Konvensjonen er å bruke navn med UPPER_CASE og local for å angi at en verdi ikke skal endres. Når konstanter plasseres øverst i en modul som lokale variabler, får JIT-kompilatoren også et hint om at disse verdiene er stabile.

For ekte uforanderlighet kan De bruke en proxy-tabell med __newindex som utløser en feil ved endring – dette tar vi opp i leksjonen om metatabeller.

local MAX_RETRIES = 3
local PI = 3.14159265358979
local APP_VERSION = "1.0.0"

-- Use them as read-only by convention
local area = PI * 5 * 5
print(area)           -- 78.539...
print(MAX_RETRIES)    -- 3

Skjuling av variabler

Skjuling oppstår når et indre omfang deklarerer en lokal variabel med samme navn som en variabel i et ytre omfang. Den indre deklarasjonen oppretter en helt ny variabel som skjuler den ytre innenfor sitt omfang. Den ytre variabelen forblir uendret og blir synlig igjen når det indre omfanget avsluttes.

Skjuling kan være forvirrende. Foretrekk unike navn i nestede omfang, men noen ganger er det tilsiktet, for eksempel når løkkevariabelnavn brukes på nytt i nestede løkker.

local x = "outer"
do
  local x = "inner"  -- shadows outer x
  print(x)            -- inner
end
print(x)              -- outer (unchanged)

local n = 10
for n = 1, 3 do       -- loop n shadows outer n
  print(n)            -- 1, 2, 3
end
print(n)              -- 10 (outer unchanged)

Unngå forurensing av globalt omfang

Utilsiktede globale variabler er en vanlig Lua-feil: Hvis De skriver feil navn på en lokal variabel, opprettes en ny global variabel uten varsel. Modulen strict.lua, som ofte inkluderes i prosjekter, oppdager lesing og skriving av ikke-deklarerte globale variabler ved å legge til en metatabell i _G.

En enklere fremgangsmåte er å alltid bruke local og kjøre luac -p eller en linter som luacheck for å oppdage utilsiktede globale variabler før kjøring.

-- Dangerous: typo creates a global silently
local counter = 0
coutner = 5  -- typo! creates global 'coutner'
print(counter)  -- 0 (not 5!)
print(coutner)  -- 5 (the typo global)

-- Fix: always use local keyword
local score = 0
score = 10  -- assigns to existing local
print(score) -- 10

Nil-tilordning sletter globale variabler

Hvis De setter en global variabel til nil, fjernes den fra _G, og minnet frigjøres. Dette er den riktige måten å «slette» en global variabel på. For lokale variabler oppnås samme effekt ganske enkelt ved å la dem gå ut av omfanget – søppeltømmeren frigjør minnet.

Vær forsiktig når De sender nil i en flertallstilordning: Det kan avkorte argumentlisten i enkelte sammenhenger, særlig med funksjonskall på høyresiden.

myGlobal = "exists"
print(myGlobal)   -- exists
print(_G.myGlobal ~= nil)  -- true

myGlobal = nil
print(myGlobal)   -- nil
print(_G.myGlobal ~= nil)  -- false
-- The entry is removed from _G

Kort kontroll

Hva er omfanget til en variabel som deklareres med local x = 5 inne i kroppen til en for-løkke?

Oppsummering: Deklarere variabler i Lua

Dette er det viktigste fra leksjonen:

  • Variabler er globale som standard – bruk alltid local
  • Lokale variabler er raskere (ingen oppslag i hashtabell) og sikrere
  • Flertallstilordning: a, b = b, a bytter om på verdiene på én linje
  • Alle globale variabler ligger i _G; å sette dem til nil sletter dem
  • Skjuling: En indre local skjuler den ytre variabelen uten å endre den
  • Bruk UPPER_CASE for konstanter etter konvensjonen

Neste: aritmetiske, relasjonelle og logiske operatorer.

Gratis å komme i gang

Lær deg Lua med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
40
Leksjoner
159

Ofte stilte spørsmål

Er leksjonen «Deklarere variabler i Lua» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Deklarere variabler i Lua», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Deklarere variabler i Lua»?

Forstå forskjellen mellom globale og lokale variabler, samt navnekonvensjoner. Du øver på Lua Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Lua Academy?

Ingen tidligere erfaring er nødvendig. Lua Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Deklarere variabler i Lua»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Lua Academy-leksjonen?

Ja. Alle Lua Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Oversikt over Lua-datatyper
  2. Deklarere variabler i Lua
  3. Aritmetiske operatorer og sammenligningsoperatorer
  4. Typetvang og konvertering
← Tilbake til Lua Academy