首页 > 代码库 > lua的点和冒号的区别
lua的点和冒号的区别
lua的语法很简单,太简单了,所以lua就复杂了
两个点与一个点有什么区别呢?
一个点用来定义和取得一个变量,这个变量可能是个函数
两个点用来定义和调用一个函数,两个点会自动传入“调用者”这个table自身
先看简单的:
c = {a = 1, b = 2}
function c:foo()
print(self.a,self.b)
end
这里,c这个table定义了一个foo函数,用两个点定义的,在foo函数第一个参数的地方自动传入了c自身,然后调用一下
c:foo()
输出1 2
也可以这样,一个点调用函数,手动传入table:c.foo(c)
输出也是一样的
下面看复杂一点的:
两个点会自动传入调用者本身,但是他仅仅只会传入调用者本身,他没有一个点灵活,这个怎么理解?看代码
c = {a = 1, b = 2}
c.foo = function(c) print(c.a,c.b) end
d = {}
d.foo2 = c.foo
d:foo2()
输出为:nil nil
解释下上面的代码:
首先创建一个table,然后定义一个函数foo,这个函数访问了table中的a和b两个变量
然后创建了另一个table,b
在b中定义一个变量foo2,赋值为c这个table中的foo函数
然后调用d这个table中的foo2函数,输出为nil nil
因为d是两个点调用的foo2,那么会自动吧d本身传入函数的第一个参数,那么函数的运行就是这样的:
function (d)
print(d.a,d.b)
end
d这个table没有定义a和b两个变量,输入当然就是nil
像这种情况就只能一个点调用,显示的传入c这个table
d:foo2()改为d.foo2(c) 这样就可以了
输出1 2
上面的例子还可以这么写:
c = {a=1,b=2}
function c:foo()
print(self.a,self.b)
end
d = {}
d.foo2 = c.foo
d.foo2(c)
lua的点和冒号的区别