Lua
2014-12-27 22:56:31 11 举报
AI智能生成
lua 学习笔记
作者其他创作
大纲/内容
基本
字符串
不可变,不可改
\ddd 十进制 5.1 \097 \971 (错误ASCII 0-255) \09a 只取09
lua5.2 \xHH 十六进制
单行注释 -- 多行注释[[ ]] [=[ ]=]
技巧:-- [[
以下都是注释。。。
注释。。。
还是注释。。。
--]]
字符串连接 .. 10 .. 20 前后空格,区别小数点
常量元表 s:byte(1,3)
#操作符取长度,可以包含'\0',不是终结符
字符串值永远不等于数字型值
短字符优化,惰性hash
关系运算
a and b or c b为真才等价C中的 a?b:c
语句
多重赋值 顺序副作用 a,a=1,2不确定 print(fun1(),fun2(),fun3())执行顺序不确定
多重返回值调整 语句中最后一个值返回多个,其余调整为一个,没有为nil,()强制返回一个
控制结构 if..then elseif then else end
numberic for 无限循环:for var=1,math.huge do .... end
值类型
type(var)得到类型字符串
8种 nil,boolean,string,userdata,function,thread,table,number
boolean 判断 false nil为假 0 为真 其他都为真
函数
函数是值,函数定义是赋值语句
参数调整,多丢弃,少用nil补齐
变长参数 ...
select('#',...) 得到参数个数
selset(1,...) 得到第一个参数
5.1 隐含参数 arg=(... ,n=个数)
5.2 table.pack(...) 返回等价的arg,含有n域 local arg = {n=select('#',...),...}
额外:array表打散成一系列参数
table.unpack(tableVal,startPos,count)
具名实参 为了不管参数顺序只用一个table参数,参数由约定好的table字段得到{size=9,num=8}
缺省参数
1.函数体内 n=n or 1 (缺省值)
2.table 类似于具名实参
泛型函数 用一个名字表示任何函数调用 func(...)
变长参数使用例子
预先赋值好
func=print
table_a 一个table值
func(table.unpack(table_a)) 相当于调用了print
异常处理
抛出
error(string 或者 table) 返回 输入文件名 : 行号:错误字符串
assert(表达式,string 或者 table) 如果为假,调用error
5.1 error入参数就返回什么,table就返回table,string就返回string
5.2 如果入参含有__tostring 域,就转为string
捕获
pcall(BLOCK) 返回[true,false] ,errorstring
泛型for pairs iparis io.lines() string.gmatch() 函数工厂
泛型for 与 协程
递归定义,先声明
table
既不是值也不是变量,是对象
初始化表达式 3种形式 array key-value mixed 支持嵌套
a.x 与 a[x] 区别 a.x是a["x"] a[x]是以变量x的值为索引
易出错的保护,数组下标显示转换 a[tonumber(j,10)] 10进制数
空隙数组 table.maxn #
元表
table userdata 各自实体独立元表 string 常量元表 print(getmetatable(""))
算数类
一元 __unm(相反数) __len
二元 __add __mul __sub __div __mod __pow __concat只要一个操作数含有元方法
支持混合值类型,顺序查找左操作数元表,查找右操作数元表
关系类
__lt __le 2个操作数必须相同类型,不同元方法出错
__eq 永远不会出错 2个操作数必须相同类型,或者table或者userdata必须元表相同,否则直接返回false
__index(读) __newindex(写) failback概念,不存在的域读写才触发
不通过元表rawget(table, key) rawset(table, key, value) rawequal (v1, v2) rawlen (v)
其他
__gc __metatable __tostring __call必须是函数原型function fun(...)
协程
合作型多线程,自己调度。依赖闭包upvalue断点继续
yield(a1,a2...) a1,a2 断点返回到resume调用处
var r1,r2 = yield(...) r1,r2 resume(r12,r2)带回
coroutine.wrap() 可以用于实现for迭代器工厂函数
Handling Yields in C http://blog.codingnow.com/2012/06/continuation_in_lua_52.html
元素遍历与操作分离,总是用协程包裹函数
模块
LUA_PATH LUA_CPATH
require与load区别
环境
存放全局变量的表,称为环境。每个函数都有一个。这个表本身可以不是全局的。
lua5.2 使用变量_ENV 表示环境, _G是全局的,_ENV不是
sanbox setenv(2,{newGlobalTable}
lua5.2只有Lua函数有_ENV
本质上,lua5.2 取消了原有意义上的 environment 。所以我们可以看到 C Function 不再有环境了。function 、在 lua 中称为 closure ,仅仅只是函数体和 upvalue 的联合体。
这简化了 lua 语言本身。全局变量实际上只是一个语法糖,编译时再前面加上了 _ENV. 的前缀。这样,从 load 开始,第一个 chunk 就被加上了 _ENV 这个 upvalue ,然后依次传递下去。
http://blog.codingnow.com/2011/12/lua_52_env.html#comments
因为是upvalue所以任何修改只针对当前函数有效!
惯用法
交换赋值 x,y=y,x
a[#a]=new_value 列表尾部插入值 a[#a]=nil 删除最后元素
库函数的输入参数涉及到数组位置,可以使用负数
number 是double型 x%1得到小数部分 x-x%1 整数部分
table用做"rope" 提高string拼接效率 table.concat
0 条评论
下一页