Latest web development tutorials

pacote do módulo Lua

Módulo é semelhante a um pacote de biblioteca, a partir de Lua 5.1, Lua acrescentou mecanismo de gestão módulo padrão, você pode colocar um pouco de código comum em um arquivo, na forma de chamadas de interface API em outros lugares, em favor da reutilização de código e reduzir código de acoplamento.

módulo Lua é a tabela de variáveis, funções e outros elementos conhecidos, criando, assim, um módulo muito simples, é para criar uma tabela, em seguida, a necessidade de exportar as constantes, funções na qual, finalmente voltou para a mesa na linha. O seguinte é a criação de um module.lua módulo específico, o formato de código de arquivo é o seguinte:

-- 文件名为 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

A partir do exposto, a estrutura do módulo é uma estrutura de tabela, para que possa chamar a tabela como um elemento na operação para operar como uma constante no módulo ou função de chamada.

O func2 acima declarados como variáveis ​​locais bloquear, o que significa uma função particular e, portanto, não pode ser acessado a partir do exterior do módulo de função privada deve ser chamado pela função pública módulo.


exigem função

Lua fornece uma função chamada exigem é utilizado para carregar os módulos. Para carregar um módulo, basta chamá-lo. Por exemplo:

require("<模块名>")

ou

require "<模块名>"

Irá retornar após a execução requer uma constante ou função por um módulo que consiste em mesa, e irá definir uma variável global que contém a tabela.

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

O código acima é executado como resultado de:

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

Ou para carregar módulos definir uma variável de alias, chamada fácil:

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

O código acima é executado como resultado de:

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

mecanismo de carregamento

Para módulos de costume, não em que diretório de arquivos vai fazer, exigem função tem a sua própria estratégia de carregamento caminho do arquivo, ele tenta carregar o arquivo de módulo de Lua ou C biblioteca de programas.

Exigir caminho de pesquisa para arquivos Lua é armazenado no package.path variável global, após as botas Lua, LUA_PATH valor inicial da variável de ambiente para a variável de ambiente. Se você não encontrar a variável de ambiente, o caminho padrão definido por uma inicialização em tempo de compilação.

É claro que, se não houver LUA_PATH essa variável de ambiente, você também pode personalizar as configurações, aberto no arquivo .profile diretório home do usuário atual (ele não cria, você também pode abrir o arquivo .bashrc), por exemplo, o caminho "~ / lua /" para se juntar ambiente LUA_PATH variável:

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

caminho do arquivo "," separados por dois final ";;" representa o recém-adicionado mais o caminho original do caminho padrão.

Em seguida, atualizar os parâmetros variáveis ​​de ambiente para ter efeito imediato.

source ~/.profile

Então valores package.path assumidas são:

/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

Então, quando chamando require ( "módulo") irá tentar abrir os seguintes diretórios de arquivos para procurar alvos.

/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

Se aproximou-se do arquivo de destino será chamado package.loadfile para carregar módulos. Caso contrário, vá para bibliotecas C.

caminho de busca do arquivo é package.cpath obtido a partir de uma variável global, e esta variável é LUA_CPATH a variáveis ​​de ambiente iniciais.

Estratégia de busca com o mesmo que acima, mas agora a busca é por isso substituído ou tipo de arquivo dll. Se você encontrá-lo, então ele vai exigir pelo package.loadlib para carregá-lo.


pacote C

Lua e C são facilmente combinados usando C para escrever pacote de Lua.

Escrever um pacote diferente e Lua, pacote C antes do uso deve primeiro ser carregado e ligado, na maioria dos sistemas é a maneira mais fácil de conseguir mecanismos de biblioteca de vínculo dinâmico.

Lua fornece toda a funcionalidade de ligação dinâmica em uma função chamada loadlib. Esta função recebe dois argumentos: o caminho absoluto para a função de biblioteca e inicialização. Assim, um exemplo de uma chamada típica é:

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

função loadlib carrega a biblioteca especificada e conectado a Lua, mas não abrir a biblioteca (ou seja, sem função de inicialização chamada), caso contrário, ele retorna função de inicialização como uma função Lua, para que possamos chamá-lo diretamente em Lua.

Se o erro ocorreu durante o carregamento de uma biblioteca dinâmica ou de inicialização de pesquisa função, loadlib retorna mensagens de Nil e erro. Nós podemos modificar a secção anterior de código para detectar erros e, em seguida, chamar a função de inicialização:

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

Em circunstâncias normais, esperamos que o lançamento da biblioteca binário contém um arquivo stub semelhante trecho de código anterior, os binários de instalação pode ser facilmente colocado em um diretório, você só precisa modificar o arquivo de biblioteca stub binário corresponde ao caminho real.

O diretório onde o arquivo foi adicionado ao LUA_PATH stub, essa configuração pode ser usada depois de carregar a biblioteca C funções requerem a.