Lua 高级语法
时间:2018/10/18 10:55:52
参考:
Lua 高级语法
元表 (meattable)
类似于其他语言的重载操作,重载运算操作 如 + 等。
Lua 提供了两个用来处理元表的方法:
setmetatable(table, metatable):此方法用于为一个表设置元表。
getmetatable(table):此方法用于获取表的元表对象。
可以重载的方法:
元方法
含义
"__add"
+ 操作
"__sub"
- 操作 其行为类似于 "add" 操作
"__mul"
* 操作 其行为类似于 "add" 操作
"__div"
/ 操作 其行为类似于 "add" 操作
"__mod"
% 操作 其行为类似于 "add" 操作
"__pow"
^ (幂)操作 其行为类似于 "add" 操作
"__unm"
一元 - 操作
"__concat"
.. (字符串连接)操作
"__len"
# 操作
"__eq"
== 操作 函数 getcomphandler 定义了 Lua 怎样选择一个处理器来作比较操作 仅在两个对象类型相同且有对应操作相同的元方法时才起效
"__lt"
< 操作
"__le"
<= 操作
"__index"
取下标操作用于访问 table[key],根据下标访问元素,当表中不存在对应元素的时候,通过重载的函数返回对应的值
"__newindex"
赋值给指定下标 table[key] = value
"__tostring"
转换成字符串
"__call"
当 Lua 调用一个值时调用
"__mode"
用于弱表(week table)
"__metatable"
用于保护metatable不被访问
重载 + 操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 local set1 = { 1 , 2 , 3 }
local set2 = { 3 , 4 , 100 }
-- 定义合并函数
local union = function ( self , other )
local indexSet = {}
local result = {}
for i , v in pairs ( self ) do
indexSet [ v ] = true
end
for i , v in pairs ( other ) do
indexSet [ v ] = true
end
-- 遍历value不为空的元素
for k , v in pairs ( indexSet ) do
table . insert ( result , k )
end
return result
end
-- 重载元方法
setmetatable ( set1 , { __add = union } )
local set3 = set1 + set2
for k , v in pairs ( set3 ) do
print ( string . format ( "%s : %s" , k , v ))
end
面向对象
对象定义和使用
注:通过 : 定义和调用函数,self 参数省略。通过 . 不能省略。
通过 __index 元表实现对象,表中找不到对应元素则会从 __index 指定的表中查找。
定义对象 person.lua :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 local _Person = {}
function _Person:getName()
return self.name
end
function _Person:sayHello()
print("Hello Lua!")
end
function _Person:new(name)
name = name or "default name"
return setmetatable({ name = name }, { __index = _Person })
end
return _Person
初始化和使用对象:
local person = require("person")
-- 初始化对象
local xiaoTian = person:new("XiaoTian")
-- 调用对象的方法
xiaoTian:sayHello()
print(xiaoTian.name)
print(xiaoTian:getName())
继承
继承可以用元表实现,它提供了在父类中查找存在的方法和变量的机制。在 Lua 中是不推荐使用继承方式完成构造的,这样做引入的问题可能比解决的问题要多。
成员私有性
在 Lua 中,成员的私有性,使用类似于函数闭包 的形式来实现。代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 function newAccount ( initialBalance)
local self = { balance = initialBalance }
local withdraw = function ( v )
self . balance = self . balance - v
end
local deposit = function ( v )
self . balance = self . balance + v
end
local getBalance = function () return self . balance end
return {
withdraw = withdraw ,
deposit = deposit ,
getBalance = getBalance
}
end
a = newAccount ( 100 )
a . deposit ( 100 )
print ( a . getBalance ()) --> 200
print ( a . balance ) --> nil
虚变量
_ 表示虚变量,可以用来接收并丢弃多余的返回值,或者迭代器结果。