跳转至

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

初始化和使用对象:

1
2
3
4
5
6
7
8
9
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

虚变量#

_ 表示虚变量,可以用来接收并丢弃多余的返回值,或者迭代器结果。