Lua笔记

闭包

示例一

 1 function newCounter()
 2     local i = 0
 3     return function()     -- anonymous function
 4        i = i + 1
 5         return i
 6     end
 7 end
 8  
 9 c1 = newCounter()
10 print(c1())  --> 1
11 print(c1())  --> 2

示例二

1 function myPower(x)
2     return function(y) return y^x end
3 end
4  
5 power2 = myPower(2)
6 power3 = myPower(3)
7  
8 print(power2(4)) --4的2次方
9 print(power3(5)) --5的3次方

Lua中的变量,如果没有local关键字,全都是全局变量,Lua也是用Table来管理全局变量的,Lua把这些全局变量放在了一个叫“_G”的Table里。

我们可以用如下的方式来访问一个全局变量(假设我们这个全局变量名叫globalVar):

1 _G.globalVar
2 _G["globalVar"]

MetaMethod

__add(a, b)                     对应表达式 a + b
__sub(a, b)                     对应表达式 a - b
__mul(a, b)                     对应表达式 a * b
__div(a, b)                     对应表达式 a / b
__mod(a, b)                     对应表达式 a % b
__pow(a, b)                     对应表达式 a ^ b
__unm(a)                        对应表达式 -a
__concat(a, b)                  对应表达式 a .. b
__len(a)                        对应表达式 #a
__eq(a, b)                      对应表达式 a == b
__lt(a, b)                      对应表达式 a < b
__le(a, b)                      对应表达式 a <= b
__index(a, b)                   对应表达式 a.b
__newindex(a, b, c)             对应表达式 a.b = c
__call(a, ...)                  对应表达式 a(...)

模块

  1. require(“model_name”)函数,载入同样的lua文件时,只有第一次的时候会去执行,后面都不执行了;
  2. dofile(“model_name”)函数,每一次文件都会执行;
  3. loadfile(“model_name”)函数,载入后不执行,等你需要的时候执行时;
1 local hello = loadfile("hello")
2 ... ...
3 ... ...
4 hello()

 一行代码实现表的拷贝

1 u = {unpack(t)}

需要注意的是此法在表内条目大于2000时会失效。

一行代码判断表是否为空

#t == 0并不能判断表是否为空,因为#预算符会忽略所有不连续的数字下标和非数字下标。

正确做法是:

if next(t) == nil then 
    -- 表为空
    -- ...
end

因为表的键可能为false,所以必须与nil比较,而不直接使用~next(t)来判断表是否空。

更快的插入代码

-- 更慢
table.insert(t, value) 
 
-- 更快
t[#t+1] = value 

原因:[]和#避免了高层的函数调用开销

原文地址:https://www.cnblogs.com/YYRise/p/5366053.html