Lua如何管理”package”
Lua如何管理”package”
方式一:
私有方法和变量都需要显式定义为local类型的,这很容易造成错误。一旦不小心漏写,就又将方法定义为全局的了。
”package”中方法和变量的定义都需要加上”package”名字前缀。
-- "complex.lua"文件中
local complex = {} --[[ 在5.0之后,Lua用了一种类似于寄存器的虚拟机模式,Lua用栈来储存其寄存器。每一个活动的函数,Lua都会对其分配一个栈,这个栈用来储存函数里的活动记录。
lua的编译器将local变量存储至寄存器,对local变量的操作就相当于直接对寄存器进行操作,对global变量的操作要先获取变量,然后才能对其进一步操作,自然局部变量比全局变量快。
对于全局变量,一是内存访问不如寄存器快,二是可能影响到cache line,对于lua这个东西,全局变量是通过一个table访问的,又是一级间接访问,就更慢了。--]] function complex.new (r, i)
return {r=r, i=i}
end -- 声明私有变量和方法,需要加上local
local function checkComplex (c)
if not ((type(c) == "table") and
tonumber(c.r) and tonumber(c.i)) then
error("bad complex number", )
end
end complex.i = complex.new(, ) function complex.add (c1, c2)
checkComplex(c1);
checkComplex(c2);
return complex.new(c1.r + c2.r, c1.i + c2.i)
end function complex.sub (c1, c2)
return complex.new(c1.r - c2.r, c1.i - c2.i)
end function complex.mul (c1, c2)
return complex.new(c1.r*c2.r - c1.i*c2.i,
c1.r*c2.i + c1.i*c2.r)
end function complex.div (c1, c2)
local n = c2.r^ + c2.i^
return complex.new(
(c1.r * c2.r + c1.i * c2.i) / n,
(c1.i * c2.r - c1.r * c2.i) / n
)
end return complex
方式二:
优化了”package”中方法的定义方式,使得无论是公有还是私有方法都摆脱了”package”名字前缀。不过与此同时,每个方法都需要显式定义为local类型的,这很容易造成错误。一旦不小心漏写,就又将方法定义为全局的了。
-- "complex.lua"文件中
local complex = {} --[[ 在5.0之后,Lua用了一种类似于寄存器的虚拟机模式,Lua用栈来储存其寄存器。每一个活动的函数,Lua都会对其分配一个栈,这个栈用来储存函数里的活动记录。
lua的编译器将local变量存储至寄存器,对local变量的操作就相当于直接对寄存器进行操作,对global变量的操作要先获取变量,然后才能对其进一步操作,自然局部变量比全局变量快。
对于全局变量,一是内存访问不如寄存器快,二是可能影响到cache line,对于lua这个东西,全局变量是通过一个table访问的,又是一级间接访问,就更慢了。--]] -- 以下的所有方法在定义时都去掉了前缀,并且均声明为私有方法("local")。
local function new (r, i) return {r=r, i=i} end local function checkComplex (c)
if not ((type(c) == "table") and
tonumber(c.r) and tonumber(c.i)) then
error("bad complex number", )
end
end local i = new(, ) local function add (c1, c2)
checkComplex(c1);
checkComplex(c2);
return new(c1.r + c2.r, c1.i + c2.i)
end local function sub (c1, c2)
return new(c1.r - c2.r, c1.i - c2.i)
end local function mul (c1, c2)
return new(c1.r*c2.r - c1.i*c2.i,
c1.r*c2.i + c1.i*c2.r)
end local function div (c1, c2)
local n = c2.r^ + c2.i^
return new(
(c1.r * c2.r + c1.i * c2.i) / n,
(c1.i * c2.r - c1.r * c2.i) / n
)
end -- 公有的方法才放在"complex"表中导出。
complex = {
new = new,
add = add,
sub = sub,
mul = mul,
div = div,
i = i,
} return complex
方式三:
注意: 这种方式有一个有趣的副作用,例如你为了安全性,屏蔽了_ENV中的io库(io.open(),io.read(),io.write()等),但别人可以通过你提供的”package”访问你屏蔽的函数(例如complex.io.write()等)。
-- "complex.lua"文件中
local complex = {} --[[ 在5.0之后,Lua用了一种类似于寄存器的虚拟机模式,Lua用栈来储存其寄存器。每一个活动的函数,Lua都会对其分配一个栈,这个栈用来储存函数里的活动记录。
lua的编译器将local变量存储至寄存器,对local变量的操作就相当于直接对寄存器进行操作,对global变量的操作要先获取变量,然后才能对其进一步操作,自然局部变量比全局变量快。
对于全局变量,一是内存访问不如寄存器快,二是可能影响到cache line,对于lua这个东西,全局变量是通过一个table访问的,又是一级间接访问,就更慢了。--]] -- 原先环境中的函数或变量需要能被访问,比如下面的"type()"。
setmetatable(complex, {__index = _ENV})
-- 下面的所有函数都会定义在独立的"complex"环境中。
_ENV = complex -- 注意: 这种方式有一个有趣的副作用,例如你为了安全性,屏蔽了_ENV中的io库(io.open(),io.read(),io.write()等),但别人可以通过你提供的”package”访问你屏蔽的函数(例如complex.io.write()等)。 -- 因为在独立的环境中,定义的全局变量存储在"complex"环境中。
-- local变量和函数不能通过complex表访问。
function new (r, i) return {r=r, i=i} end local function checkComplex (c)
if not ((type(c) == "table") and
tonumber(c.r) and tonumber(c.i)) then
error("bad complex number", )
end
end i = new(, ) function add (c1, c2)
checkComplex(c1);
checkComplex(c2);
return new(c1.r + c2.r, c1.i + c2.i)
end function sub (c1, c2)
return new(c1.r - c2.r, c1.i - c2.i)
end function mul (c1, c2)
return new(c1.r*c2.r - c1.i*c2.i,
c1.r*c2.i + c1.i*c2.r)
end function div (c1, c2)
local n = c2.r^ + c2.i^
return new(
(c1.r * c2.r + c1.i * c2.i) / n,
(c1.i * c2.r - c1.r * c2.i) / n
)
end return complex
调用complex.lua
-- "mytest.lua"文件中
-- "require"方式
local cp = require("complex") local c1 = cp.add(cp.i, cp.new(, ))
for i, v in pairs(c1) do
io.write(string.format("%s = %d", i, v))
end -- "dofile()"方式
local p = dofile("E:\\vsproj\\lua1\\complex.lua")
local c2 = p.add(p.i, p.new(, ))
for i, v in pairs(c2) do
io.write(string.format("%s = %d", i, v))
end io.write("\n")
运行现象:

Lua如何管理”package”的更多相关文章
- Lua包管理工具Luarocks详解 - 15134559390的个人空间 - 开源中国社区
Lua包管理工具Luarocks详解 - 15134559390的个人空间 - 开源中国社区 Lua包管理工具Luarocks详解
- SSISDB1:使用SSISDB管理Package
SSISDB 系列随笔汇总: SSISDB1:使用SSISDB管理Package SSISDB2:SSIS工程的操作实例 SSISDB3:Package的执行实例 SSISDB4:当前正在运行的Pac ...
- 解决Sublime包管理package control 报错 There are no packages available for installation
解决Sublime包管理package control 报错 There are no packages available for installation 真的是哔了狗了,要不是我机智的重新安装了 ...
- lua内存管理
本文内容基于版本:Lua 5.3.0 Lua内存管理器规则 Lua允许用户自定义内存管理器,并在创建Lua虚拟机(lua_State实例)时传入.当然自定义内存管理器必须遵循Lua已定义的一些行为规则 ...
- 开源基于lua gc管理c++对象的cocos2dx lua绑定方案
cocos2dx目前lua对应的c++对象的生命周期管理,是基于c++析构函数的,也就是生命周期可能存在不一致,比如c++对象已经释放,而lua对象还存在,如果这时候再使用,会有宕机的风险,为此我开发 ...
- 永久解决Sublime包管理package control 打开install package报错 There are no packages available for installation
很多用户在使用sumblime安装插件的时候,打开package control的install package会出现报错:There are no packages available for in ...
- Sublime Text 3 安装插件管理 Package Control
自动安装: 1.通过快捷键 ctrl+` 或者 View > Show Console 菜单打开控制台 2.粘贴对应版本的代码后回车安装 适用于 Sublime Text 3: import ...
- Lua 学习之基础篇七<Lua Module,Package介绍>
Lua 之Module介绍 包管理库提供了从 Lua 中加载模块的基础库. 只有一个导出函数直接放在全局环境中: [require]. 所有其它的部分都导出在表 package 中. require ...
- lua package.path的使用
需要用lua写一个工具,c++调用lua,然后这个lua要require其他lua脚本,在主lua里面设置package.path,但一直都失败,甚至lua都无法编译通过. project_path ...
随机推荐
- 基于FPGA的腐蚀膨胀算法实现
本篇文章我要写的是基于的腐蚀膨胀算法实现,腐蚀膨胀是形态学图像处理的基础,,腐蚀在二值图像的基础上做"收缩"或"细化"操作,膨胀在二值图像的基础上做" ...
- 实际开发--->php时间函数
当前日期(例:2017-10-04):date('Y-m-d',time()); 当前时间戳:strtotime(date('Y-m-d H-i-s',time()); 当前年月(例:2017-10) ...
- Divide Sum 比赛时竟然想不出。。。。。。。
Divide Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitSt ...
- bzoj3624(铺黑白路)(并查集维护)
题意网上自己随便找,绝对是找的到的. 题解:(白边表示鹅卵石路,黑边表示水泥路)这道题的解法,先考虑将黑边所有都先连起来,组成一个又一个的联通块,然后用白边去连, 如果可以联通的话,就用白边去代替黑边 ...
- HDU1201 水题
做多了年月日,现在基本就能水过了 18岁生日 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
- vue + ajax + php 接口的使用小接
vue + ajax + php 接口的使用小接 前端代码: (获取用户信息,并渲染页面) userinfor.html <!DOCTYPE html> <html lang=&qu ...
- jquery控制div随滚动条滚动效果
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>jquery div随滚动条 ...
- UltraEdit中使用正则表达式替换
UltraEdit在使用正则表达式进行查找替换时有两个可使用的语法集合.一个是 UltraEdit 的更早的版本被使用的原来的 UltraEdit 句法.另一个是"Unix"类型的 ...
- jquery各种事件使用方法总结(from:天宇之游)
ps:本博客转自博主 天宇之游 ,地址:http://www.cnblogs.com/cwp-bg/ ,再次感谢天宇之游.jquery事件使用方法总结 一.鼠标事件1. click():鼠标单击事 ...
- nginx URL重写
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...