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”的更多相关文章

  1. Lua包管理工具Luarocks详解 - 15134559390的个人空间 - 开源中国社区

    Lua包管理工具Luarocks详解 - 15134559390的个人空间 - 开源中国社区 Lua包管理工具Luarocks详解

  2. SSISDB1:使用SSISDB管理Package

    SSISDB 系列随笔汇总: SSISDB1:使用SSISDB管理Package SSISDB2:SSIS工程的操作实例 SSISDB3:Package的执行实例 SSISDB4:当前正在运行的Pac ...

  3. 解决Sublime包管理package control 报错 There are no packages available for installation

    解决Sublime包管理package control 报错 There are no packages available for installation 真的是哔了狗了,要不是我机智的重新安装了 ...

  4. lua内存管理

    本文内容基于版本:Lua 5.3.0 Lua内存管理器规则 Lua允许用户自定义内存管理器,并在创建Lua虚拟机(lua_State实例)时传入.当然自定义内存管理器必须遵循Lua已定义的一些行为规则 ...

  5. 开源基于lua gc管理c++对象的cocos2dx lua绑定方案

    cocos2dx目前lua对应的c++对象的生命周期管理,是基于c++析构函数的,也就是生命周期可能存在不一致,比如c++对象已经释放,而lua对象还存在,如果这时候再使用,会有宕机的风险,为此我开发 ...

  6. 永久解决Sublime包管理package control 打开install package报错 There are no packages available for installation

    很多用户在使用sumblime安装插件的时候,打开package control的install package会出现报错:There are no packages available for in ...

  7. Sublime Text 3 安装插件管理 Package Control

    自动安装: 1.通过快捷键 ctrl+` 或者 View > Show Console 菜单打开控制台 2.粘贴对应版本的代码后回车安装 适用于 Sublime Text 3: import   ...

  8. Lua 学习之基础篇七<Lua Module,Package介绍>

    Lua 之Module介绍 包管理库提供了从 Lua 中加载模块的基础库. 只有一个导出函数直接放在全局环境中: [require]. 所有其它的部分都导出在表 package 中. require ...

  9. lua package.path的使用

    需要用lua写一个工具,c++调用lua,然后这个lua要require其他lua脚本,在主lua里面设置package.path,但一直都失败,甚至lua都无法编译通过. project_path ...

随机推荐

  1. 《Node.js在CLI下的工程化体系实践》成都OSC源创汇分享总结

    背景: 随着开发团队规模不断发展壮大,在人员增加的同时也带来了协作成本的增加,业务项目越来越多,类型也各不相同.常见的类型有组件类.活动类.基于React+redux的业务项目.RN项目.Node.j ...

  2. 理解AngularJS中的依赖注入

    点击查看AngularJS系列目录 理解AngularJS中的依赖注入 AngularJS中的依赖注入非常的有用,它同时也是我们能够轻松对组件进行测试的关键所在.在本文中我们将会解释AngularJS ...

  3. Python迭代器,生成器--精华中的精华

    1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大 ...

  4. maven详解之结构

    maven 父子关系 父项目中打包方式必须是pom  如 <packaging>pom</packaging>,父项目中使用<modules><module& ...

  5. codevs 种树3

    codevs上的题目,自从wikioi改名后,就不怎么做题了. 这道题的话注释在代码中就可以了,还是求最长路,相较返回如果中间可以种多个的话,那就种越多越好,因为这样可以减少种的棵树, 所以这个i与i ...

  6. An Introduction to Variational Methods (5.3)

    从之前的文章中,我们已经得到了所有需要求解的参数的优化分布的形式,分别为: ‍ 但是,我们从这些分布的表达式中(参见之前的文章),可以发现这些式子并不能够直接求解.这是因为各个参数之间相互耦合,从而导 ...

  7. thinkphp增删改查

    添加数据: (添加单行数据) // 添加成功返回1,失败返回0 (添加多行数据) // 返回添加数据的条数 删除数据: 修改数据: (修改单个字段) (修改多个字段) // 修改成功返回1,失败返回0 ...

  8. 高德地图测两点距离android比较精确的

    /////参考资料:高德官方:[http://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation] 主要三 ...

  9. install xdebug

    安装准备 安排php的xdebug扩展,在php.ini上配置xdebug.通过phpinfo或者php-m 查看 [Xdebug] zend_extension ="D:\upupw7\P ...

  10. 坑中速记整理! 使用 kotlin 写第一个 ReactNative Android 模块

    Kotlin 和 Swift, 两大新宠! 借 ReactNative 熟悉下 kotlin 的用法,不料掉坑里面了.昨晚花了大半夜,趁这会儿思路清晰,把涉及到的一些关键信息,迅速整理下. 最佳的使用 ...