Lua Academy · Oppitunti

require-funktio

Ladatkaa ulkoisia moduuleja require-funktiolla ja perehtykää moduulien välimuistittamiseen.

Oppitunti 1/412 vaihetta

require-funktio on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.

require-funktion toiminta

require(modname) lataa moduulin ja palauttaa sen. Se etsii package.path-polusta .lua-tiedostoa ja package.cpath-polusta C-kirjastoa. Tulos tallennetaan välimuistiin kohteessa package.loaded[modname] — myöhemmät kutsut palauttavat välimuistissa olevan arvon suorittamatta tiedostoa uudelleen.

-- First require: loads and executes math_utils.lua
local math_utils = require("math_utils")

-- Second require: returns cached value (file not re-run)
local math_utils2 = require("math_utils")

print(math_utils == math_utils2)   -- true (same object)
print(package.loaded["math_utils"] == math_utils)  -- true

Moduulin palautusarvo

Moduulitiedoston tulee palauttaa arvo — yleensä funktioiden taulu. Tämä palautusarvo on se, jonka require antaa kutsujalle. Jos tiedosto ei palauta mitään (tai palauttaa true), require palauttaa kyseisen arvon.

-- mymodule.lua:
-- local M = {}
-- function M.hello() print("Hello from module!") end
-- return M

-- In main script:
local m = require("mymodule")
m.hello()   -- Hello from module!

-- The module table is the interface

Välimuisti kohteessa package.loaded

package.loaded on taulu, joka yhdistää moduulien nimet ladattuihin arvoihin. Voitte asettaa alkion itse esiladataksenne mockin tai asettaa sen arvoksi nil, jolloin moduuli ladataan uudelleen (moduulitiedosto suoritetaan seuraavalla require-kutsulla uudelleen).

-- Force reload by clearing cache
package.loaded["mymodule"] = nil
local fresh = require("mymodule")  -- re-executes the file

-- Preload a mock for testing
package.loaded["db"] = {
  query = function() return {} end,
  close = function() end,
}
local db = require("db")  -- gets the mock

package.path-muoto

package.path on puolipisteillä eroteltu kuvioluettelo. Paikkamerkki ? korvataan moduulin nimellä (pisteet korvataan polkuerottimilla). Voitte lisätä haettavia hakemistoja lisäämällä ne package.path-merkkijonon alkuun.

print(package.path)
-- typically: ./?.lua;./?.luac;/usr/share/lua/5.4/?.lua;...

-- Add local lib directory
package.path = "./lib/?.lua;" .. package.path

-- Now require("utils") will look in ./lib/utils.lua

require, dofile ja loadfile

require: käyttää välimuistia ja etsii package.path-polusta. dofile(path): suorittaa tiedoston heti ilman välimuistia ja käyttää suoraa polkua. loadfile(path): kääntää tiedoston mutta ei suorita sitä ja palauttaa funktion. Käyttäkää require-funktiota moduuleille ja dofile-funktiota kertaluonteisille skripteille.

-- dofile: no caching, direct path
dofile("./scripts/setup.lua")

-- loadfile: compile only, returns function
local fn, err = loadfile("./config.lua")
if fn then
  local result = fn()   -- execute when ready
end

-- require: best for modules
local json = require("json")

require ja pisteet hakemistoja varten

Käyttäkää moduulien nimissä pisteitä viitataksenne alihakemistoissa oleviin tiedostoihin. require("utils.string") vastaa tiedostoa utils/string.lua (kun polkukuviossa on ?). Näin usean tiedoston kirjastot järjestetään.

-- Directory structure:
-- lib/
--   utils/
--     string.lua
--     table.lua
--   init.lua

package.path = "./lib/?.lua;" .. package.path

local strUtils = require("utils.string")   -- loads lib/utils/string.lua
local tblUtils = require("utils.table")    -- loads lib/utils/table.lua

Moduulin alustuksen sivuvaikutukset

Moduulitiedostot suoritetaan kerran ensimmäisen require-kutsun yhteydessä. Kaikki ylimmän tason koodi (funktioiden ulkopuolella) suoritetaan require-kutsun aikana. Tämä on hyödyllistä kertaluonteisessa alustuksessa, mutta olkaa varovaisia — sivuvaikutukset, kuten verkkoyhteyksien muodostaminen tai tiedostotoiminnot, suoritetaan tuontihetkellä.

-- counter.lua:
-- local count = 0   -- initialized once on first require
-- local M = {}
-- function M.increment() count = count + 1 end
-- function M.get() return count end
-- return M

local c = require("counter")
c.increment()
c.increment()
print(c.get())   -- 2

local c2 = require("counter")
print(c2.get())  -- 2 (same instance, cached)

Virheenkäsittely require-funktiossa

Jos moduulitiedostossa on syntaksivirhe tai sen latauksen aikana aiheutuu virhe, require nostaa virheen. Virheilmoitus sisältää moduulin nimen ja tiedostossa tapahtuneen virheen. Käsitelkää moduulin latauksen epäonnistumiset hallitusti pcall-kutsulla.

local ok, mod = pcall(require, "possibly_missing")
if not ok then
  print("Module not available:", mod)
  -- fall back to alternative or default implementation
  mod = {feature = function() return "fallback" end}
end

print(mod.feature())

package.preload

package.preload on taulukko, johon voitte rekisteröidä latausfunktioita moduulin nimen perusteella. Kun kutsutaan funktiota require("name"), Lua tarkistaa ensin preload-taulukon. Näin voitte rekisteröidä moduuleja ilman tiedostoja – tämä on hyödyllistä upotetussa Luassa tai testauksessa.

package.preload["mymath"] = function()
  return {
    double = function(n) return n * 2 end,
    triple = function(n) return n * 3 end,
  }
end

local m = require("mymath")
print(m.double(5))   -- 10
print(m.triple(5))   -- 15

Kehämäinen require

Kehäriippuvuudet (A vaatii B:n ja B vaatii A:n) käsitellään osittain: Lua tallentaa true-paikanvaraajan taulukkoon package.loaded ennen moduulin suorittamista. Jos B yrittää käyttää A:n keskeneräistä taulukkoa, tulokset voivat olla puutteellisia. Välttäkää kehämäisiä riippuvuuksia moduulien suunnittelussa.

-- a.lua: local b = require("b"); local M = {}; M.name = "A"; return M
-- b.lua: local a = require("a"); print("a.name:", a.name); return {}

-- When a.lua is loaded:
-- 1. a starts executing
-- 2. requires b -> b starts executing
-- 3. b requires a -> gets partial a (still loading!)
-- 4. a.name may be nil at step 3

print("Avoid circular requires in module design")

Pikatarkistus

Mitä tapahtuu, kun kutsutte funktion require("mod") toisen kerran?

Kertaus: require

Yhteenveto:

  • require(name) lataa moduulin kerran ja tallentaa sen välimuistiin taulukkoon package.loaded
  • Moduulitiedosto palauttaa julkisen rajapintansa (yleensä taulukon)
  • Tyhjentäkää package.loaded[name], jos haluatte pakottaa uudelleenlatauksen
  • Lisätkää hakemistoja varten polkuja taulukkoon package.path
  • Käyttäkää package.preload-taulukkoa muistissa oleville moduuleille
  • Välttäkää kehämäisiä riippuvuuksia
Aloita maksutta

Opi Lua tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
40
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”require-funktio” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “require-funktio”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”require-funktio”?

Ladatkaa ulkoisia moduuleja require-funktiolla ja perehtykää moduulien välimuistittamiseen. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”require-funktio”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?

Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. require-funktio
  2. Moduulitiedoston kirjoittaminen
  3. package.path ja package.cpath
  4. Moduulien rakenteet ja parhaat käytännöt
← Takaisin: Lua Academy