lua 模块功能

lua5.1 模块理解

http://www.lua.org/manual/5.1/manual.html#pdf-module

模块

5.3 – Modules

The package library provides basic facilities for loading and building modules in Lua. It exports two of its functions directly in the global environment: require and module. Everything else is exported in a table package.

package库提供了基本的功能,可以实现加载和构建模块。

此库开放了两个接口在全局环境中(_G) require module ,

除了这两个接口,其他所有功能都开放到package表中。

实际上 require 文件 的结果 都存储在 package.loaded 表中。   例如 require “xxx”,   结果是 package.loaded[“xxx”]  = yyy (yyy 是 xxx.lua 执行结果的返回值)。

require

require (modname)

Loads the given module. The function starts by looking into the package.loaded table to determine whether modname is already loaded. If it is, then require returns the value stored at package.loaded[modname]. Otherwise, it tries to find a loader for the module.

require 语句, 会先查询 package.loaded 表, 如果表中存在, 则将 package.loaded[modname]的值作为 require 的返回值。 否则, 尝试查询模块的 loader。

To find a loader, require is guided by the package.loaders array. By changing this array, we can change how require looks for a module. The following explanation is based on the default configuration for package.loaders.

查询 loaders, 需要按照 package.loaders数组顺序查询loader。

First require queries package.preload[modname]. If it has a value, this value (which should be a function) is the loader. Otherwise require searches for a Lua loader using the path stored in package.path. If that also fails, it searches for a C loader using the path stored in package.cpath. If that also fails, it tries an all-in-one loader (see package.loaders).

首先 require 查询 package.preload表,如果失败,

然后使用 package.path存储的路径查找 lua loader, 如果失败,

然后使用package.cpath春初的路径查找 c loader, 如果失败,

则尝试 all-in-one loader。

Once a loader is found, require calls the loader with a single argument, modname. If the loader returns any value, require assigns the returned value to package.loaded[modname]. If the loader returns no value and has not assigned any value to package.loaded[modname], then require assigns true to this entry. In any case, require returns the final value of package.loaded[modname].

如果loader找到, 则 调用 此loader, 入参为一个字符串 modname。

loader(modname)

如果loader调用有返回任何值, 则设置这个返回值到 package.loaded[modname]中。

如果 loader调用没有返回值, 或者没有设置package.loaded[modname], 则 require 设置true给package.loaded[modname]。

理解: 对于lua文件, 对应的一个loader, 此loader是一个函数, 函数的环境为 require执行的环境,

lua:

local a = 111

print(a)

return a

loader:

function xx_loader( modname )

local a = 111

print(a)

return a

end

If there is any error loading or running the module, or if it cannot find any loader for the module, then require signals an error.

module

module (name [, ···])

Creates a module. If there is a table in package.loaded[name], this table is the module. Otherwise, if there is a global table t with the given name, this table is the module. Otherwise creates a new table t and sets it as the value of the global name and the value of package.loaded[name]. This function also initializes t._NAME with the given name, t._M with the module (t itself), and t._PACKAGE with the package name (the full module name minus last component; see below). Finally, module sets t as the new environment of the current function and the new value of package.loaded[name], so that require returns t.

http://www.cnblogs.com/orez88/articles/2139160.html

  • module

当在模块文件中使用module函数的时候,如下所示;

  1. module “mymodule”

实际上等同于以下的语句:

  1. local modname = “mymodule”     – 定义模块名

  2. local M = {}                               -- 定义用于返回的模块表  
  3. _G[modname] = M                      -- 将模块表加入到全局变量中  
  4. package.loaded[modname] = M    -- 将模块表加入到package.loaded中,防止多次加载  
  5. setfenv(1,M)                               -- 将模块表设置为函数的环境表,这使得模块中的所有操作是以在模块表中的,这样定义函数就直接定义在模块表中

通过module(),可以方便的编写模块中的内容。

If name is a compound name (that is, one with components separated by dots), module creates (or reuses, if they already exist) tables for each component. For instance, if name is a.b.c, then module stores the module table in field c of field b of global a.

将 路径层级 和 命名空间层级 完美契合:

module 文件  存储在 test/newModule.lua文件中

module(..., package.seeall)

dingzhiprint = function ()

print("nasView print ----22 55")

end

调用文件, 为  test.lua, 其使用方法  与路径一致。

require("test.newModule")

test.newModule.dingzhiprint()

This function can receive optional options after the module name, where each option is a function to be applied over the module.

lua5.2 module 不建议使用原因

1、 module 的接口 增加了开发者理解难度:

需要在 module 声明前, 将需要使用的 变量 local 声明, 不能直接使用全局变量。 虽然可以应用 package.seeall 可以解决这个问题, 还是不够直接。

  1. local modname = “mymodule”     – 定义模块名

  2. local M = {}                               -- 定义用于返回的模块表  
  3. _G[modname] = M                      -- 将模块表加入到全局变量中  
  4. package.loaded[modname] = M    -- 将模块表加入到package.loaded中,防止多次加载  
  5. setfenv(1,M)                               -- 将模块表设置为函数的环境表,这使得模块中的所有操作是以在模块表中的,这样定义函数就直接定义在模块表中

2、 module语法破坏了全局环境, 可能导致命名冲突。

module(…)用法不会导致冲突,  但是如果用户自定义 modname, 则若干模块很容易冲突,

例如 a b 两个文件夹, a/a.lua 定义了 module(“test”)   b/b.lua 也定义了 module(“test”),

则造成冲突。

https://john.nachtimwald.com/2014/07/19/writing-lua-modules/

lua 5.2 推荐使用方法:

local M = {}

function M.func1()

print("func1")

end

function M.func2()

print("func2")

end

return M

local fm = require("functions_module")

fm.func1()

fm.func2()

时间: 2024-11-10 16:40:17

lua 模块功能的相关文章

ngx lua模块源码简单解析

ngx lua模块源码简单解析分类: nginx 2014-07-11 11:45 2097人阅读 评论(0) 收藏 举报nginxlua数据结构架构目录(?)[+]对nginx lua模块的整个流程,原理简单解析.由于nginx lua模块相关配置,指令,API非常多,所以本文档只以content_by_lua指令举例说明. 读本文档最好配合读源码. 不适合对nginx和lua一点都不了解的人看.1.相关配置详细配置见 https://github.com/openresty/lua-ngin

lua 模块与环境

编写一个模块的最简单方法: -- complex.lua -- 模块实际上是一个表 complex = {} -- 定义模块函数 function complex.add(c1,c2) ... end -- 调用模块内部的函数,需要complex.前缀 function complex.callAdd(c1,c2) complex.add(c1,c2) end -- 之前的声明把所有函数都放入complex表中了,最后返回这个表 return complex 调用这个模块时: -- main.l

生产环境上nginx 不覆盖添加lua模块

需求如下: 需要在nginx配置文件中判断请求中是否带某参数变量,nginx配置本身没有此判断功能. 网上查找资料,可以在nginx中添加lua模块,使用lua的脚本去判断.比较靠谱的文章:CentOS系统下,如何安装 nginx_lua_module 模块 以及 echo-nginx-module 模块 主要安装: lua-nginx-module-master ngx_devel_kit-master LuaJIT 三个模块,但找了一圈发现都是需要**重新编译nginx并且覆盖安装**. 再

about家庭智能设备部分硬件模块功能共享【协同工作】solution

本人设备列表: Onda tablet {Android} wifi Desktop computer {win7.centos7} 外接蓝牙adapter PS interface 键盘.鼠标{与同局域网laptop通过synergy软件共享,使其成为共享的输入设备} 3.5mm interface低音炮{通过Bluetooth连接laptop,从而让laptop也可以使用该声音输出设备} 250G硬盘,通过在linuxcentos上搭建NFSNetwork File System,使其硬盘资

Php+Redis 实现Redis提供的lua脚本功能

<?php require_once "predis-0.8/autoload.php"; $config['schema'] = 'tcp'; $config['host']= "192.168.1.7"; $config['port'] = 6379; $redis = new Predis\Client($config); class wode extends Predis\Command\ScriptedCommand { public functio

phalcon:整合官方多模块功能,方便多表查询

项目分为: namespace Multiple\Backend; namespace Multiple\Frontend; 目录结构如下: public/index.php的大致写法: 多模块功能: // Handle the request $application = new Application($di); //加入模块分组配置 $application->registerModules( array( 'frontend' => array( 'className' => '

Winform开发框架中的内容及文档管理模块功能介绍

在开发项目的时候,我们有一些场景需要编辑一些HTML文档,作为内容发布系统的一部分,有时候也需要对一些文档如WORD文档进行编辑管理,这样需要我们对这些内容及文档进行合适的管理.本文主要介绍在WInform项目中利用ZetaHtmlEditControl进行HTML内容管理,以及利用TX TextControl控件进行WORD文档管理,这两方面都是我们一般进行内容和文档管理所必须的. 1.内容及文档管理模块功能介绍 整个模块,支持WInform框架和混合式开发框架两种模式,都是基于WInform

nginx多域名ssl证书以及lua模块的编译安装

#!/bin/bash #unzip zip&tar file function  untarfile(){ for i in $( ls . |grep -v .sh) do val=$(echo $i | grep ".zip$" |wc -l) if [[ "$val"  -eq  1 ]];then dirname=$(echo $i|sed "s/.zip//") if [[ ! -d $dirname ]];then echo

(转)关于ES6的 模块功能 Module 中export import的用法和注意之处

关于ES6的 模块功能 Module 中export import的用法和注意之处 export default 的用法 export default命令用于指定模块的默认输出.显然,一个模块只能有一个默认输出,因此export deault命令只能使用一次.所以,import命令后面才不用加大括号,相反其它的export 输出 可以有多个,且import时必须加大括号,示例如下: 1 // modules.js 2 function add(x, y) { 3 return x * y; 4