lua5.1学习笔记(二)

来源:互联网 发布:linux安装ipython3 编辑:程序博客网 时间:2024/06/08 18:56

一:__tostring函数能将各种类型的值表示为一种简单的文本格式,函数print总是调用其实参的__tostring来格式化其输出,__tostring会检查该值是否有一个__tostring的元方法。

local mt = {}

mt.__tostring = function( tbl )

local tmp = {}

for k in pairs(tbl) do

tmp[#tmp + 1] = k

end

return "{" .. table.concat(tmp,"/") .. "}" 

end

  local t = {1,2,3,4,5,0,9,8,7,a,bc}

      setmetatable(t,mt)

      print(t)

输出结果:

{1/2/3/4/5/6/7/8/9}


二:在lua代码中,只能设置table的元表。若要设置其他类型的值的元表,则必须通过C代码来实现。


三:关于table的key(table构造,table constructor)

a = {x=10,y=20}   等价于

  a = {}  a.x=10,a.y=20 也等价于

a={}   a["x"] = 10, a["y"] = 20 也等价于

a = { ["x"]=10,["y"]=20}


四:关于table的长度

长度符号"#"用于返回一个数组或者线性表的最大索引值,或者返回一个字符串的字母总数。但是“#”遇到nil就会返回。看以下例子:

str = "aaga"
print(#str)
 -->3

a = {}

print(#a) -->0

a[99]=1

print(#a) -->0

print(table.maxn(a)) -->99

记住:table中所有未初始化的元素,索引的结果都是nil。lua将nil定界为数组或者线性表的结束标记。"#"操作符遇到nil值元素即结束返回。如果真的需要处理中间含有nil元素的table,就得使用table.maxn函数咯.


五:关于__index元方法

__index元方法不一定是一个函数,它还可以是一个table。当它是一个函数时,lua以table和一个不存在的Key作为参数来调用此函数。如下所示:

mt = {}

mt.__index = function (table, key)

return table[key] 

end

而当它是一个table时,lua就以相同的方式来查找该table,如下所示:

mt={}

proto = {x=1,y=2,width=3,height=4}

mt.__index=proto

t = {x=100,y=20}

setmetatable(t,mt}

print(t.height)




0 0
原创粉丝点击