Lua学习小记

(1).. 是字符串连接操作符,但是必须用空格分隔它,不然lua会以为这是一个小数点
(2)字符串内不需转义 : [[ ]] 或者[==[ ]==] (==可以是其他任意符号)
(3)注释 –[[ ]](一般使用–]]),或者 –[==[ ]==]
(4)字符串转换为数字: tonumber(),不能返还为一个正确的数字时返回nil
如果需要确认一个变量的类型,可以用 type(o) == “number” type(o) == “string” type(o) == “table”
(5)数字(或function)转换为字符串:tostring()
(6)获取字符串的长度,在字符串前放置# print(#”hello”) –> 5,#放在数组前则返回最后一个索引值
也可以用table.getn.table.maxn 返回最大正索引数(忽略空隙)
(7)table创建:a = {},赋值 a[“x”] = 12, a.y = 14.a.y等价于a[“y”],而a[y]是以变量y为索引
(8)精确到小数点后两位 x - x % 0.01
(9)不等于 ~=,and 和or返回的是参数,而not只返回 true或false
(10)如果x不存在,给x一个默认值 x = x or d d为设定的默认值
(11) c中的a ? b : c在lua中可实现为 a and b or c
(12) if then elseif else end
while do end
repeat until
for do break end 如果想要无限循环,上限可以用math.huge
for i,v in ipairs(a) do print(v) end (pairs, ipairs, string.gmatch)
ipairs 迭代数组中的序号和值,pairs迭代table中的key,value
(13) unpack()接受一个数组作为参数,并从下标1开始返回该数组的所有元素
(14) …可表示函数的变长参数,function add(…) for i, v in ipairs(…) do 或者 local a,b = …
select(n,…) 可以返回可变实参中的第n个参数,包括nil
local arg = {…}; arg.n = select(“#”, …) arg是新版中使用的替代原来的…
(14.5) v:name(args)等价于 v.name(v,args),”:”是一种语法糖
定义的时候: Class:test()与 Class.test(self)是等价的
调用的时候: object:test() 与object.test(object)等价
可以把点号(.)作为静态方法来看待,冒号(:)作为成员方法来看待。
(15)所有function都是closure的特例,参数包括全局变量,局部变量,非局部的变量
(16)迭代器的几种方式:
1.closure迭代器,返回一个closure的方法,需要返回方法,恒定状态,控制变量

        function valuse(t)
          local i = o
          returen function(0) i = i + 1; return t[i] end
        end
2.无状态的迭代器,同上,没有非局部的变量,放在返回方法中
        local functino iter(a, i)
          i = i +1
          local v = a[i]
          if v then
            return i ,v
          end
        end
3.可变状态的迭代器,和上面不同,不是恒定状态,因此也不需要控制变量
        local iterator  --需要先声明
        function iter()
          local state = {line = io.read(), pos = 1}
          return iterator, state
        end

        function iterator (state)
          < block >
          return something
        end
4.协同方式编写的迭代器

(17)动态生成执行代码:loadfile(), loadstring(),其中dofile的实现如下

    function dofile(filename)
      local f = assert(loadfile(filename))
      return f(0
    end
loadstring("i = i + 1") 等价于(词法域不同,前者为全局环境) function() i = i + 1 end

(18)动态连接机制 package.loadlib 用于引入动态链接库,package.loaded[name] 是否为true来判断一个模块是否已加载。
package同时包含lua模块和C模块。
(19)错误处理,assert() erro()抛出异常 pcall()捕获异常
如果没有发生错误,pcall会返回true及函数调用的返回值,否则,返回false及错误消息
if pcall(function()
<受保护的代码>
end) then
<常规代码>
else
<错误处理代码>
end
debug.debug():提供一个lua提示符
debug.traceback():根据调用栈来构建一个扩展的错误消息,可在任何时候获取当前执行的调用栈
上面这两个函数通常和xpcall(, )一起使用,以获得额外信息

(20)协同程序
lua将所有关于协同程序的函数放在一个名为”coroutine”的table中;协程的状态:挂起,运行,死亡,正常
创建(挂起状态):
co = coroutine.create(function(a, b) print(a .. b) coroutine.yield() end)
查看状态:
coroutine.status(co)
启动或再次启动(运行,运行完成后为死亡):
coroutine.resume(co, “a”, “b”)
其中”a”,”b”是传递给协程的参数,如果不是首次执行,则传入的参数就是协程中的相应yield()的返回值(第二个返回值开始,第一个是true或false)。协程结束之后的返回值也会作为coroutine.resume的返回值(第一个为true或false,第二个开始为实际返回值)。
在运行过程中,函数中的coroutine.yield()可以让函数挂起,之后再恢复其运行。死亡的协程如果继续被调用会返回false和错误信息。
如果协程A唤醒了协程B,则A就为正常状态
coroutine.wrap(function() dosometing end) :用于写协程实现的迭代器

(21)将table中的每个字符串元素组合起来,table.concat(table)
(22) string.gmatch(返回查找到字符串的迭代器)
string.find(字符串查找)
string.gsub(全局字符串替换)
string.gfind(全局字符串查找)
(23)以上字符串的方法都基于lua模式匹配:字符串模式
.(点): 与任何字符配对
%a: 与任何字母配对
%c: 与任何控制符配对(例如\n)
%d: 与任何数字配对
%l: 与任何小写字母配对
%p: 与任何标点(punctuation)配对
%s: 与空白字符配对
%u: 与任何大写字母配对
%w: 与任何字母/数字配对
%x: 与任何十六进制数配对
%z: 与任何代表0的字符配对
%x(此处x是非字母非数字字符): 与字符x配对. 主要用来处理表达式中有功能的字符(^$()%.[]*+-?)的配对问题,
例如%%与%配对
%b 用来匹配对称的字符。常写为 ‘%bxy’ ,x和y是任意两个不同的字符;x作为匹配的开始,y作为匹配的结束。比
如,’%b()’ 匹配以 ‘(’ 开始,以 ‘)’ 结束的字符串
当上述的字符类用大写书写时, 表示与非此字符类的任何字符配对. 例如, %S表示与任何非空白字符配对.例
如,’%A’非字母的字符。
‘%’ 用作特殊字符的转义字符,因此 ‘%.’ 匹配点;’%%’ 匹配字符 ‘%’。转义字符 ‘%’不仅可以用来转义特殊字符
,还可以用于所有的非字母的字符。
+ 匹配前一字符1次或多次
* 匹配前一字符0次或多次
- 匹配前一字符0次或多次
? 匹配前一字符0次或1次
string.format(“%q”,a) 这可以用双引号来括住字符串a,并且正确的转移a中的双引号和换行符等字符
手动生成的长字符串,为了不用转义其中的问题字符,可以用[=[…]=]来括住字符
string.format(“%s %s %s”, “1”,”2”,”3”)
(24) 元表 setmetatable(set,mt) getmetatable()
重载+ mt.__add = Add
重载* mt.__mul
重载- mt.__sub
重载/ __div
重载% __mod
重载^ __pow
重载- __num
重载.. __concat
以上为算数类元方法,lua会优先调用第一个对象的方法,没有的话再调用第二个
重载= __eq
重载< __lt
重载<= __le
以上为关系类元方法,必须两个对象的方法相同lua才会调用,否则一律返回false
__tostring 定义 .tostring()方法
__index 当访问一个table中不存在的字段时,会调用__index方法,rawget可忽略元方法
__newindex 赋值,更新时调用,rawset可忽略该方法

(25)动态执行代码:dofile(filename), loadfile(filename)(), loadstring(“return ” .. varname)()
(26)动态计算变量名称,并赋给全局变量 varname = name_ .. tostring(i); _G[varname] = value
(27)改变一个函数的环境,setfenv(func, env)
继承全局环境,但是和原来的全局变量不同的环境:

     a = 1
     local newgt = {}
     setmetatable(newgt, {__index = _G})         --如果不设置__index,那就没有全局中的print函数了
     setfenv(1, newgt)    --参数1表示当前函数,2表示调用当前函数的函数,这里1也可以换成a
     print(a)  --> 1
 这样做之后改变a的值,_G.a不会改变

(28)遍历一个table(不论是数字为key的成员还是函数成员都可以遍历到):

function Raverse()
    local i = 0

    for k, v in pairs( _G ) do
        print("v: " .. tostring(k));
        i = i + 1;
    end

    print("num = " .. tostring(i));
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值