<p>关于Lua的<a href="http://www.lua.org/about.html" target="_blank" rel="external noopener noreferrer">官方定义</a>:</p>

别的我就不多安利了

type

table

table是类似class的hash_map,由data和method两部分组成。简而言之,数据和行为是分离的,后者在Lua中称为metatable。
metatable有很多特有的键,在此我们粗暴的认为特有键类似c++中的操作符,它们的值一般为function或table。

setmetatable

我们可以通过setmetatable来赋予table不同的动作。

1
2
3
4
t = {}              
mt = {}
setmetatable(t, mt) -- 设定mt为t的metatable
getmetatable(t) -- 返回mt

以上代码可以缩略为:

1
t = setmetatable({}, {})

__index与__newindex

1
2
3
4
5
6
7
8
other = {}
t = setmetatable({}, { __newindex = other })
t.foo = 3
t.foo -- nil
other.foo -- 3
t = setmetatable({}, { __index = other })
t.foo -- 3
other.foo -- 3
  • __index类似于[]操作符
  • __newindex类似于[]=操作符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
t = setmetatable({}, {
__newindex = function(t, key, value)
if type(value) == "number" then
rawset(t, key, value * value)
else
rawset(t, key, value)
end
end
})

t.foo = "foo"
t.foo -- "foo"
t.bar = 4
t.bar -- 16
  • rawgetrawset可以避免调用重载后的操作符(__index和__newindex)

__tostring

1
2
3
4
5
6
7
8
9
t = setmetatable({ 1, 2, 3 }, {
__tostring = function(t)
sum = 0
for _, v in pairs(t) do sum = sum + v end
return "Sum: " .. sum
end
})

print(t) -- prints out "Sum: 6"

operator

运算符只能是函数

  • __add
  • __sub
  • __mul
  • __div
  • __mod
  • __unm
  • __concat
  • __eq
  • __lt
  • __le

function

一个机智的计数器

1
2
3
4
5
6
7
8
9
10
11
12
function ()
local i = 0
return function()
i = i + 1
return i
end
end
newCounter1 = InitCounter()
print(newCounter1()) -- 1
print(newCounter1()) -- 2
newCounter2 = InitCounter()
print(newCounter2()) -- 1

wheel

德堪邀请我入坑,考虑了一下还是可行的。
现在手头还没拿到项目,所以自己造轮子玩。