local和面向对象
local x = {a=1}
x.b = 2 -- 不能加local,否则错误:unexpected symbol near '.'
print(x.b)
local bird = {canfly = true}
function bird:new() -- 不能加local,理由同上面,作用域在bird
local b = {}
setmetatable(b,self)
self.__index = self
return b
end
local ostrich = {}
-- local ostrich = bird:new() -- new操作创建了一个新的表,这个表检查是否有元表
-- ostrich.canfly = false
print(bird.canfly)
print(ostrich.canfly)
结果:
true
nil
- 本身ostrich.canfly是没有canfly这个属性的,如果new()之后,如手册所说:metatable允许改变table的行为,例如相加,当试图执行这个操作时,会检查2个表是否有一个表有metatable,并检查是否有__add域,如果找到就调用这个函数去计算结果。
冒号与点号
local obj={x=20}
function obj:fun1()
print(self.x)
end
obj:fun1()
- 调用函数obj.fun1()失败,必须用冒号,因为冒号默认接收一个参数self,而点号需要自己显示的传入self参数。
tonumber()和tostring()
local a = tostring(5)
local b = tonumber("a")
print(a)
print(b)
print(a == 5)
结果:
5 -- 一个字符串tonumber()后为nil,一个数字tostring之后值不变,但是不等于原来的值。
nil
false
-- local a1 = true
-- local a2 = ""
-- local a3 = 1
-- local a4 = "a"
-- -- if type(a) == "boolean" then
-- -- print("aaa")
-- -- end
-- print(tonumber(a1))
-- print(tonumber(a2)) --为nil
-- print(tostring(a2))
-- print(tonumber(a3))
-- print(tostring(a4))
nil
nil
1
a
[Finished in 0.1s]