首页 > 代码库 > 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的点和冒号的区别