Latest web development tutorials

package module Lua

Le module est similaire à un package de bibliothèque, à partir de Lua 5.1, Lua ajouté mécanisme de gestion de module standard, vous pouvez mettre un peu de code commun dans un seul fichier, sous la forme d'API des appels d'interface dans d'autres endroits, en faveur de la réutilisation du code et de réduire couplage de code.

Module Lua est la table des variables, des fonctions et d'autres éléments connus, créant ainsi un module très simple, est de créer une table, puis la nécessité d'exporter les constantes, fonctions dans lesquelles, finalement retourné à la table sur la ligne. Ce qui suit est la création d'un module.lua de module personnalisé, format de code de fichier est le suivant:

-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}
 
-- 定义一个常量
module.constant = "这是一个常量"
 
-- 定义一个函数
function module.func1()
    io.write("这是一个公有函数!\n")
end
 
local function func2()
    print("这是一个私有函数!")
end
 
function module.func3()
    func2()
end
 
return module

De ce qui précède, la structure du module est une structure de la table, de sorte que vous pouvez appeler la table comme un élément de l'opération à fonctionner comme une constante dans le module ou la fonction appelante.

Le func2 ci-dessus déclarés bloquent les variables locales, ce qui signifie une fonction privée, et donc ne peut pas être accessible depuis l'extérieur du module de fonction privée doit être appelée par la fonction publique module.


exiger fonction

Lua fournit une fonction appelée require est utilisée pour charger des modules. Pour charger un module, il suffit de l'appeler. Par exemple:

require("<模块名>")

ou

require "<模块名>"

Sera de retour après l'exécution nécessite une constante ou une fonction par un module constitué de table, et définir une variable globale qui contient la table.

-- test_module.lua 文件
-- module 模块为上文提到到 module.lua
require("module")
 
print(module.constant)
 
module.func3()

Le code ci-dessus est exécutée à la suite de:

这是一个常量
这是一个私有函数!

Ou de charger des modules définissent une variable d'alias, appel facile:

-- test_module2.lua 文件
-- module 模块为上文提到到 module.lua
-- 别名变量 m
local m = require("module")
 
print(m.constant)
 
m.func3()

Le code ci-dessus est exécutée à la suite de:

这是一个常量
这是一个私有函数!

Mécanisme de chargement

Pour les modules personnalisés, pas sur quel répertoire de fichiers va faire, exiger fonction a sa propre stratégie chemin du fichier de chargement, il tente de charger le fichier de module à partir de la bibliothèque de programme Lua ou C.

Exiger chemin de recherche de fichier Lua est stocké dans la package.path variable globale, après le démarrage Lua, LUA_PATH valeur initiale de la variable d'environnement à la variable d'environnement. Si vous ne trouvez pas la variable d'environnement, le chemin par défaut défini par une initialisation de la compilation.

Bien sûr, s'il n'y a pas LUA_PATH cette variable d'environnement, vous pouvez également personnaliser les paramètres, ouvert dans le répertoire d'accueil du fichier .profile de l'utilisateur actuel (il ne crée pas, vous pouvez également ouvrir le fichier .bashrc), par exemple, le chemin "~ / lua /" pour rejoindre environnement LUA_PATH variables:

#LUA_PATH
export LUA_PATH="~/lua/?.lua;;"

Chemin du fichier ";" séparés par les deux derniers ";;" représente le nouvellement ajouté, plus le chemin d'origine du chemin par défaut.

Ensuite, mettre à jour vos paramètres de variables d'environnement à prendre effet immédiatement.

source ~/.profile

Ensuite, les valeurs package.path assumées sont:

/Users/dengjoe/lua/?.lua;./?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/lib/lua/5.1/?.lua;/usr/local/lib/lua/5.1/?/init.lua

Donc, lorsque vous appelez require ( "module") va essayer d'ouvrir les répertoires de fichiers suivants pour rechercher des cibles.

/Users/dengjoe/lua/module.lua;
./module.lua
/usr/local/share/lua/5.1/module.lua
/usr/local/share/lua/5.1/module/init.lua
/usr/local/lib/lua/5.1/module.lua
/usr/local/lib/lua/5.1/module/init.lua

Si approché le fichier cible sera appelé package.loadfile pour charger des modules. Sinon, passez aux bibliothèques C.

chemin de recherche de fichier est package.cpath obtenu à partir d'une variable globale, et cette variable est LUA_CPATH aux variables d'environnement initiales.

Stratégie de recherche avec le même que ci-dessus, mais maintenant la recherche est donc remplacé ou le type de fichier dll. Si vous le trouvez, alors il faudra par package.loadlib pour le charger.


C package

Lua et C sont facilement combinés en utilisant C pour écrire package Lua.

Écrire un package différent et Lua, C emballage avant utilisation doit d'abord être chargé et connecté, dans la plupart des systèmes est le meilleur moyen de parvenir à des mécanismes de la bibliothèque de liens dynamiques.

Lua fournit toutes les fonctionnalités de liaison dynamique dans une fonction appelée LOADLIB. Cette fonction prend deux arguments: le chemin absolu à la fonction de la bibliothèque et de l'initialisation. Ainsi, un exemple d'un appel typique est:

local path = "/usr/local/lua/lib/libluasocket.so"
local f = loadlib(path, "luaopen_socket")

fonction LOADLIB charge la bibliothèque spécifiée et connecté à Lua, mais il ne s'ouvre pas la bibliothèque (ie pas appel de fonction d'initialisation), sinon il retourne fonction d'initialisation en fonction Lua, de sorte que nous pouvons l'appeler directement en Lua.

Si l'erreur est survenue lors du chargement d'une bibliothèque dynamique ou initialisation fonction recherche, LOADLIB renvoie des messages de néant et d'erreur. Nous pouvons modifier la section précédente de code pour détecter les erreurs et ensuite appeler la fonction d'initialisation:

local path = "/usr/local/lua/lib/libluasocket.so"
-- 或者 path = "C:\\windows\\luasocket.dll",这是 Window 平台下
local f = assert(loadlib(path, "luaopen_socket"))
f()  -- 真正打开库

Dans des circonstances normales, nous attendons la libération de la bibliothèque binaire contient un extrait de code fichier stub similaire précédent, les binaires d'installation peuvent être facilement placés dans un répertoire, il vous suffit de modifier le fichier binaire bibliothèque stub correspond à la trajectoire réelle.

Le répertoire dans lequel le fichier a été ajouté à la LUA_PATH stub, ce paramètre peut être utilisé après le chargement de la bibliothèque C fonctions nécessitent.