4.23. Lua modules and packages

发布时间 : 2025-10-25 13:34:11 UTC      

Page Views: 9 views

Module is similar to a wrapper library. Starting from Lua 5.1, Lua adds a standard module management mechanism that allows you to put some common code in a file to API the form of the interface is called elsewhere, which is conducive to code reuse and reduce code coupling.

Lua the module is composed of known elements such as variables, functions, etc. table so it is simple to create a module, which is to create a table and then put the constants and functions that need to beexported into it, and finally return this table just do it. The following is the creation of a custom module module.lua the format of the file code is as follows:

-- The file name is module.lua -- Define a module named module module = {} -- Define a constant module.constant = "This is a constant" -- Define a function function module.func1() io.write("This is a public function!\\n") end local function func2() print("This is a private function!") end function module.func3() func2() end return module 

From the above, we can see that the structure of the module is a table so it can be called like an operation table to manipulate constants or functions in the calling module that way.

Above. func2 the local variable declared as a block represents a private function, so the private function in the module cannot be accessed from the outside and must be called through the public function in the module.

4.23.1. Require function #

Lua provides a file named require is used to load the module to load a module, simply call it. For example:

require("")    

Or

require ""    

Execution require which is made up of module constants or functions table and also defines a file that contains the table the global variable.

Test_module.lua file #

-- test_module.lua file -- The module module is the module. lua mentioned earlier require("module") print(module.constant) module.func3() 

The result of the above code execution is:

This is a constant This is a private function! 

Or define an alias variable for the loaded module to make it easy to call:

Test_module2.lua file #

-- test_module2.lua file -- The module module is the module. lua mentioned earlier -- Alias variable m local m = require("module") print(m.constant) m.func3() 

The result of the above code execution is:

This is a constant This is a private function! 

4.23.2. Loading mechanism #

For custom modules, module files can not be placed in any file directory, function require it has its own file path loading strategy, which attempts to load from the Lua load the module in the file or C library.

require for search Lua the path to the file is stored in the globalvariable package.path in, when Lua after startup, the environmentvariable LUA_PATH to initialize the environment variable if the environment variable is not found, it is initialized with a default path defined at compile time.

Of course, if not, LUA_PATH this environment variable can also be customized and opened in the current user root directory .profile file (if not, create, open .bashrc files are also available), for example, adding “~ / lua/” path LUA_PATH in the environment variable:

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

The file paths are separated by a “;” sign, and the last two “;;” means that the newly added path is followed by the original default path.

Next, update the environment variable parameters to take effect immediately.

source ~/.profile 

At this point, assume that the value of package.path :

/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 

Then call require("module") will try to open the following file directory to search for the target.

/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 

If the target file is found, the call is called package.loadfile to load the module. Otherwise, you will go to the C library.

The file path of the search is from the global variable package.cpath and this variable is obtained through the environment variable LUA_CPATH in the beginning.

The search strategy is the same as above, except that now the search strategy is so or dll a file of type. If you can find it, then require it will pass. package.loadlib to load it.

4.23.3. C packet #

Lua is easy to combine with C, using C for Lua write a bag.

Unlike Lua , and the easiest way to implement it in most systems is through the dynamic link library mechanism.

Lua in a place called loadlib all the functions of dynamic connections are provided in the This function takes two parameters: the absolute path to the library and the initialization function. So a typical example of a call is as follows:

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

loadlib function loads the specified library and connects to the Lua . However, it does not open the library (that is, it does not call theinitialization function), instead it returns the initialization function as``Lua`` , so that we can go directly to the Lua call him in.

If there is an error loading the dynamic library or finding the initialization function loadlib will return nil and error messages. We can modify the previous code to detect errors and then call theinitialization function:

local path = "/usr/local/lua/lib/libluasocket.so" -- or path = "C:\\windows\\luasocket.dll",This is under the Window platform local f = assert(loadlib(path, "luaopen_socket")) f() -- Truly open the library 

In general, we expect a binary publishing library to contain a similar to the previous code snippet stub file, you can put it in a directory whenyou install the binary library, and you only need to modify it stub the file corresponds to the actual path of the binary library.

Set stub directory where the file is located is added to the LUA_PATH so that after it is set, you can use the require the function loads the C library.

《地理信息系统原理、技术与方法》  97

最近几年来,地理信息系统无论是在理论上还是应用上都处在一个飞速发展的阶段。 GIS被应用于多个领域的建模和决策支持,如城市管理、区划、环境整治等等,地理信息成为信息时代重要的组成部分之一; “数字地球”概念的提出,更进一步推动了作为其技术支撑的GIS的发展。 与此同时,一些学者致力于相关的理论研究,如空间感知、空间数据误差、空间关系的形式化等等。 这恰好说明了地理信息系统作为应用技术和学科的两个方面,并且这两个方面构成了相互促进的发展过程。