Lua核心编程之进阶&总结

来源:互联网 发布:mac 照片所在文件夹 编辑:程序博客网 时间:2024/04/26 20:12


1、Metatable

1)metatable是用来定义一个table的行为的table。
2)table默认行为可以进行遍历,但table不能相加, metatable允许改变默认行为。

3)Lua中每个table都可以有meltable 

4)新表默认是不带metatable的
测试:

t = {} print(getmetatable(t))  --> nil

5)任何表可是其它表的metatable, 一组相关表可以共享一个metatable, 个表也可以是自身的metatable。
测试:

t1= {}setmetatable(t, t1) assert(getmetatable(t) == t1)
个人觉得这里很难理解,找到一个详细的博客 http://www.jb51.net/article/56690.htm

2、metamethods用途

Lua为table的metatable提供一组预定义操作函数,
这些函数叫metamethods。 当执行table某些操作的时候,会去寻找table中是否有
这个操作对应的metamethods,如果有执 函数并返 回结果,否则操作报错。

local mt = {}function mt.__add(a, b)    return 'table + ' .. bendlocal t = {}setmetatable(t, mt)print(t + 1)

每个算术操作符有对应的 metamethod:

+__add*__mul-__sub/__div-__unm (for negation)%__mod^__pow

对于连接操作符有对应的 metamethod:__concat

同样,对于关系操作符也都有对应的 metamethod:

==__eq<__lt<=__le

其他的关系操作符都是用上面三种表示:
a ~= b 表示为 not (a == b)
a > b 表示为 b < a
a >= b 表示为 b <= a

和算术运算符不同的是,关系运算符用于比较拥有不同的 metamethod(而非 metatable)的两个 value 时会产生错误,例外是比较运算符,拥有不同的 metamethod 的两个 value 比较的结果是 false。

不过要注意的是,在整数类型的比较中 a <= b 可以被转换为 not (b < a),但是如果某类型的所有元素并未适当排序,此条件则不一定成立。例如:浮点数中 NaN(Not a Number)表示一个未定义的值,NaN <= x 总是为 false 并且 x < NaN 也总为 false。

3、封装、多态、继承。这些体现出Lua语言的面向对象的高级特性了。

4、系统库

1)数值与字符串的转化:

a = tonumber("3.14")a = tostring(3.14)

2)字符串格式化:

print(string.format("hi %d", 2))

3)table的方法。

local t = {}for i = 1,10 dotable.insert(t,i)endtable.remove(t,2)for k,v in pairs(t) doprint(k,v)end

4)映射 table.key

local t = {}t.a = 1t.b = 2t.a = nil   --删掉a的映射for k,v in pairs(t) doprint(k,v)end


5、总结:

1)买一送二之:

table=数组+映射

2)程序员从0开始,大众习惯从1开始

数组下表从1开始,连续使用,自动扩展

3)万物皆值:

函数也是一种值

4)凭什么C语言只能返回1个?

函数支持多返回参数

5)逻辑运算就是说英文:and or not

字符串连接用 ..

local 大法好:优化,作用域控制

6)迭代器之数组遍历: for k,v in ipairs(t) do ... end

迭代器之Table遍历:for k,v in pairs(t) do ... end





0 0
原创粉丝点击