lua 模块与环境

编写一个模块的最简单方法:

  1. -- complex.lua
  2. -- 模块实际上是一个表
  3. complex = {}
  4. -- 定义模块函数
  5. function complex.add(c1,c2) ... end
  6. -- 调用模块内部的函数,需要complex.前缀
  7. function complex.callAdd(c1,c2)
  8. complex.add(c1,c2)
  9. end
  10. -- 之前的声明把所有函数都放入complex表中了,最后返回这个表
  11. return complex

调用这个模块时:

  1. -- main.lua
  2. local complex = require("complex")
  3. complex.add(x,y)

上述代码有几点麻烦:

1.在模块内部,一个函数调用另一个函数时,必须加上complex前缀

2.最后必须返回complex这个表

改进的办法:

  1. -- complex.lua
  2. -- 模块实际上是一个表,这里从require的参数(...)获取模块名称
  3. local modName = ...
  4. -- 模块的内部名称M
  5. local M = {}
  6. -- lua的全局变量默认存储地方为_G, _G[modName] = M 等价于定义一个名字为modName的全局变量
  7. _G[modName] = M
  8. -- require函数当一个函数无返回值的时候,会返回package.loaded[模块名]的值
  9. -- 于是这样写就可以省去最后的return语句了
  10. package.loaded[modName] = M
  11. -- setfenv是lua版本的using namespace M,这样写就可以避免每次都加M.前缀了
  12. -- 为了能够访问其他全局变量,把M的元表的__index字段设为_G,这样不在M表的函数和变量就会到_G表查找
  13. setmetatable(M, {__index = _G})
  14. setfenv(1,M)
  15. -- 定义模块函数,注意,模块名称被省略
  16. function add(c1,c2) ... end
  17. -- 调用模块内部的函数,需要complex.前缀
  18. function callAdd(c1,c2)
  19. add(c1,c2)
  20. end
  21. -- 不用返回这个表
  22. -- return M

上述的代码好麻烦,lua5.1提供了一个函数,完成等价功能,只需要这样写:

  1. -- complex.lua
  2. -- module等价于上述一大段函数, package.seeall让这个模块可以访问_G中的变量
  3. -- 如果只调用mudule(...)就不能访问
  4. module(..., package.seeall)
  5. -- 定义模块函数,注意,模块名称被省略
  6. function add(c1,c2) ... end
  7. -- 调用模块内部的函数,需要complex.前缀
  8. function callAdd(c1,c2)
  9. add(c1,c2)
  10. end
  11. -- 不用返回这个表
  12. -- return M

来自为知笔记(Wiz)

时间: 2024-10-11 20:13:17

lua 模块与环境的相关文章

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

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

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】Debian环境下openresty的安装

OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器,它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. OpenResty 通过汇聚各种设计精良的 Nginx 模块, 从而将 Nginx 有效的变成一个强大的 Web 应用服务器, 这样, Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种C以及Lua 模块, 快速构造出足以胜任 10K+ 并发连接响应的超高性能Web 应用系统. OpenResty 的

在cocos code ide的基础上构建自己的lua开发调试环境

现在无论是端游还是手游(基于cocos2d)的开发, 基本模式都是c++内核 + lua逻辑的路线.对于c++的开发和调试, vs已经能很好的满足开发者的需求, 微软这方面真是值得称颂.不幸的是, lua的开发和调试,还没有一个统一的,方便的开发调试环境,这也给广大的luaer和项目造成了极大的困扰.目前通常的做法大致有如下几种: 1.纯粹意义上的lua编辑器, 如Sublime Text 2 + 插件的模式,解决了代码提示和补齐问题. 2.编辑器的基础上加入调试功能, 通常是直接在vs上开发一

Nginx编译安装Lua模块

Nginx编译安装Lua模块 一.安装Lua环境及相关库 官网网址:https://github.com/openresty/lua-nginx-module LuaJIT ` wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz make install PREFIX=/usr/local/LuaJIT export LUAJIT_LIB=/usr/local/LuaJIT/lib export LUAJIT_INC=/usr/local/Lu

配置 Windows 下的 nodejs C++ 模块编译环境 安装 node-gyp

配置 Windows 下的 nodejs C++ 模块编译环境 根据 node-gyp 指示的 Windows 编译环境说明, 简单一句话就是 "Python + VC++ 编译环境". 所有需要的安装文件, 我都下载好放到百度云盘了: nodejs-gyp-windows Python 安装 python-2.7.7.msi iso 虚拟磁盘 安装 DTLite4491-0356.exe Windows XP 文件在: node-gyp-windows/windowsXP 用 DTL

QT Creator 加 apxs 搭建Apache模块开发环境

一 概述: 本文说述的是在苹果机器上搭建Apache模块开发环境的方法,选用的IDE是QT Creator.实质上,我最开初是选用CodeBlocks进行搭建,并且搭建成功了.但CodeBlocks当前的13.12版本在Mac的机器上很不稳定(其官网就特别地说明过不一点).我使用时发现其启动较慢,运行过程中老是闪退等问题,于是才改用QT Creator.这里要声明的是,我在Windows及Linux上使用CodeBlocks,其表现很稳定,功能也是很强的,所以我才第一个选他.本文并不会涉及Apa

Lua语言基础汇总(10) -- Lua中的环境概念

前言 Lua将其所有的全局变量保存在一个常规的table中,这个table称为“环境”.这种组织结构的优点在于,其一,不需要再为全局变量创造一种新的数据结构,因此简化了Lua的内部实现:另一个优点是,可以像其他table一样操作这个table.为了便于实施这种操作,Lua将环境table自身保存在一个全局变量_G中.例如,我们可以使用以下代码打印当前环境中所有全局变量的名称. 1 for n in pairs(_G) do print(n) end 在你的电脑上运行一下以上代码,看看结果. 全局

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