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 ...
随机推荐
- Linux学习——shell编程之变量
shell编程之变量:Linux shell编程基础中的变量. 包括Bash变量的分类和各变量的详细使用,如:用户自定义变量.环境变量.语系变量.位置参数变量和预定义变量. 1:什么是Bash变量? ...
- NOIP2017SummerTraining0712
个人感受:打了三个小时不到的第一题,然后也就没有多少时间去搞第二题了,特别是第二题还看到了期望这样的东西,这个难以理解,第三题的树分治,myx大佬说50分好拿,但是我觉得也挺难拿的. 单词检索 时间限 ...
- PHP中include与require的特点和区别说明
引用文件的方法有两种:require 及 include.两种方式提供不同的使用弹性. require 的使用方法如 require("MyRequireFile.php"); . ...
- Ubuntu 定时任务中的环境变量设置
背景 1,定时任务命令 crontab -e 2,默认的环境变量 SHELL=/bin/sh PATH=/usr/bin:/bin PWD=/home/owl LANG=zh_CN.UTF- SHLV ...
- Python自学笔记-lambda函数(来自廖雪峰的官网Python3)
感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. 匿名函数 通过 ...
- Java高新技术 Myeclipse 介绍
Java高新技术 Myeclipse 介绍 知识概述: (1)Myeclipse开发工具介绍 (2)Myeclipse常用开发步骤详解 ...
- 使用jquery-qrcode在页面上生成二维码,支持中文
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- win10 uwp 绑定密码
win10 下,密码框无法绑定到ViewModel,Password是不可以绑定. 我们可以自己使用简单方法去绑定 我们之前在WPF 使用绑定密码框,我写了一篇,关于如何绑定,我提供一个我自己试了可以 ...
- 从零开始教你封装自己的vue组件
组件(component)是vue.js最强大的功能之一,它可以实现功能的复用,以及对其他逻辑的解耦.但经过一段时间的使用,我发现自己并没有在业务中发挥出组件的最大价值.相信很多刚开始使用vue的朋友 ...
- UVa1605,Building for UN
我比较好奇的是uva后台是怎么测这题的 没什么可说的,那些不想敲但还是想直接交这题的直接copy过去吧 #include <iostream> #include <cstring&g ...