Programming in lua 杂记(转)
g = function () i = i + 1 end
这个例子中, 和想象的一样g 使用局部变量i , 然而f 使用全局变量i ; loadstring 总是在全局环境中编译他的串。
i =
local i =
f = loadstring("i = i + 1 print(i)")
g = function () i = i + print(i) end print(f())
print(g())
-- 输出结果:
2,require 和dofile 完成同样的功能但有两点不同:
=> require 会搜索目录加载文件
为了确定路径, Lua 首先检查全局变量LUA_PATH 是否为一个字符串, 如果是则认为这个串就是路径; 否则require 检
查环境变量LUA_PATH的值, 如果两个都失败require 使用固定的路径( 典型的"?;?.lua" )
Lua 保留一张所有已经加载的文件的列表( 使用table 保存) 。如果一个加载的文件在表中存在require 简单的返回; 表
中保留加载的文件的虚名, 而不是实文件名。所以如果你使用不同的虚文件名require 同一个文件两次,将会加载两次该文
件。比如require "foo" 和
require "foo.lua" , 路径为"?;?.lua" 将会加载foo.lua 两次。我们也可以通过全局变量_LOADED访问文件名列表。
在require运行一个chunk 以前, 它定义了一个全局变量_REQUIREDNAME 用来保存被required 的虚文件的文件名。
dofile当作Lua运行代码的chunk的一种原始的操作。dofile实际上是一个辅助的函数。真正完成功能的函数是loadfile;与dofile不同的是loadfile编译代码成中间码并且返回编译后的chunk作为一个函数,而不执行代码;另外loadfile不会抛出错误信息而是返回错误代。我们可以这样定义dofile:
3,lua的错误处理(断言)
n = assert(io.read("*number"), "invalid input")
assert 首先检查第一个参数, 若没问题, assert不做任何事情; 否则, assert 以第二个参数作为错误信息抛出。第二个参
数是可选的。注意, assert 会首先处理两个参数, 然后才调用函数。
基本的原则是: 对于程序逻辑上能够避免的异常, 以抛出错误的方式处理之, 否则返回错误代码。
4,如果在Lua 中需要处理错误, 需要使用pcall 函数封装你的代码。
local status, err = pcall(function () error({code=121}) end)
两个常用的debug 处理函数: debug.debug 和debug.traceback;
也可以用xpcall来来处理错误,并可将其封装为此下trycall函数(方便使用):
-- 打印错误信息
local function __TRACKBACK__(errmsg)
local track_text = debug.traceback(tostring(errmsg), );
print("---------------------------------------- TRACKBACK ----------------------------------------");
print(track_text, "LUA ERROR");
print("---------------------------------------- TRACKBACK ----------------------------------------");
local exception_text = "LUA EXCEPTION\n" .. track_text;
return false;
end --[[ 尝试调一个function 这个function可以带可变参数
如果被调用的函数有异常 返回false,退出此方法继续执行其他代码并打印出异常信息;]]
function trycall(func, ...)
local args = { ... };
return xpcall(function() func(unpack(args)) end, __TRACKBACK__);
end
--测试代码: trycall(function(param)
print("message "..param)
print("message "..nil)
end, "test trycall")
5,lua中的对象
当一个表的metatable存在一个__index函数时,如果Lua调用一个原始表中不存在的函数,Lua将调用这个__index指定的函数。
这样可以用__index实现在多个父类中查找子类不存在的域。
local a, b = ...如果需要作为table使用,则将其放 入{} 即可for i,v in ipairs({...}) do print(v) end如果...中含有nil,则
最好通过 select函数来访问for i=1, select("#", ...) do print(select(i, ...)) end
7,解释器
8.__call元方法释义
meta = {}
meta.__call = function(obj, param1, param2)
print(obj, param1, param2)
print(obj.test)
end
a = {}
setmetatable(a, meta)
a.test = "Oh-yeah"
a(a.test, )
-- 输出结果:
table: 0x7fd2f9404fc0 Oh-yeah 99
Oh-yeah
Programming in lua 杂记(转)的更多相关文章
- Programming in Lua读书笔记
Lua的长处之一就是可以通过新类型和函数来扩展其功能.动态类型检查最大限度允许多态出现,并自动简化调用内存管理的接口,因为这样不需要关心谁来分配内存谁来释放内存,也不必担心数据溢出.高级函数 ...
- Learning Lua Programming (2) Lua编程基础
开始学习Lua编程,首先从一些简单的语法开始. 一.编辑环境 下面推荐一个Lua编程的IDE,感觉是很强大的.ZeroBrane Studio,windows平台,mac平台都有.点击打开链接 官方 ...
- Programming in lua 环境
Lua 用一个名为environment 普通的表来保存所有的全局变量.(更精确的说,Lua在一系列的environment 中保存他的“global”变量,但是我们有时候可以忽略这种多样性)这种结果 ...
- Programming In Lua 第十章
1,lua中的数据结构都是表来实现的.数组就是索引为数值的表. 2,矩阵就是二维数组,三角矩阵就是矩阵的一半. 3,稀疏矩阵问题: 4, 5, 6,
- Programming In Lua 第八章
1, 也就是说,lua虽然会把代码预编译成中间码,以提高运行速度.但其会在程序运行过程中需要编译器,所以其仍然是解释型语言.loadfile会加载一个文件并将其编译成中间码,并返回一个函数. 2, 3 ...
- Programming In Lua 第三章
1, 2, 3, 4, 5,lua中,只有false和nil为假,0和空字符串为真. 6, 7,
- Programming In Lua 第二章
1,lua基本类型:nil,boolean,number,string,userdata,function,thread,table.可以用函数type获取变量的类型. 2,lua中的字符串可以用单引 ...
- Programming In Lua 第一章
1,Lua可以嵌入其他应用程序(如CGILua或IUPLua). 2,lua代码的语句,分号是可以省略的.同一行可以有多条lua语句,最好用分号隔开(当然也可以不隔开) 3,外壳与lua解释器的区别. ...
- lua杂记
protoc-gen-lua 编译.安装.使用教程: https://blog.csdn.net/huutu/article/details/49672225 https://github.com/s ...
随机推荐
- 远程访问MySQL遇到的一些问题
一.access deny GRANT ALL PRIVILEGES ON *.* TO '用户名'@'IP地址' IDENTIFIED BY '密码' with grant option;
- 对象序列化成Json字符串 及 反序列化成对象
一. public static string JsonSerializer<T>(T t) { DataContractJsonSerializer ...
- SQL Server简洁查询正在运行的进程SQL
通常我们可以使用 sp_who2 我们希望更加简洁的信息,下面这个查询使用系统表sys.sysprocesses,以及sys.dm_exec_sql_text做OUTER APPLY. T-SQL是这 ...
- PHP-仿ecshop生成验证码
<?php /* 生成验证码 */ // 1.创建画布(基于已有图像) $n = mt_rand(1,5); $im = imagecreatefromjpeg('./images/captch ...
- Eclipse创建Android模拟器创建选项解释
- [UCSD白板题] The Last Digit of a Large Fibonacci Number
Problem Introduction The Fibonacci numbers are defined as follows: \(F_0=0\), \(F_1=1\),and \(F_i=F_ ...
- ajax 跨域请求时url参数添加callback=?会实现跨域问题
例如: 1.在 jQuery 中,可以通过使用JSONP 形式的回调函数来加载其他网域的JSON数据,如 "myurl?callback=?".jQuery 将自动替换 ? 为正确 ...
- 头部加mead(便于seo优化)
<meta name="Keywords" content="关键词,关键词" /> <meta name="description ...
- 连接MySQL数据库(android、php、MySQL)
管理MySQL数据库最简单和最便利的方式是PHP脚本.运行PHP脚本使用HTTP协议和android系统连接.我们以JSON格式编码数据,因为Android和PHP都有现成的处理JSON函数. 下面示 ...
- MyEclipse使用技巧
1. 大小写切换: Ctrl + Shift + X 大写: Ctrl + Shift + Y 小写: 2. 自动导包: Ctrl + Shift + O 3. 运行前自动保存 ...