Lua自我引用

时间:2013-06-22 22:21:34

标签: lua this self

你是如何在自己的程序中获得变量的?

与Java一样,你有:

private int a

public void sa(int a) { this.a = a}
public void ga() { return this.a }

VB有'我'而C#有'这'等。

但Lua相当于什么呢?这是正确的方向吗?

local a

function sa(a)
    self.a = a
end

4 个答案:

答案 0 :(得分:11)

在lua中,您没有特定的类实现,但您可以使用表来模拟它。 为了简单起见,Lua给你一些“语法糖”:

要声明一个类成员,您可以使用这个完整的等效syntazes

  function table.member(self,p1,p2)
  end

  function table:member(p1,p2)
  end

  table.member = function(self,p1,p2)
  end

现在,棘手的部分来了:

调用

table:member(1,2)

你得到:

  

自我=表,P1 = 1,P2 = 2

调用

table.member(1,2)

你得到:

  

自= 1,P1 = 2,P2 =零

换句话说,:模仿真实的类,而.更像是静态使用。 好的是你可以混合这两种风格,例如:

table.member(othertable,1,2)

给出

  

自我= othertable,P1 = 1,P2 = 2

通过这种方式,您可以从实现多重继承的其他类“借用”方法

答案 1 :(得分:1)

在某种程度上你是这么说的,但是OOP的方法有点不同。以下是实际的方法。

local t = {
    a
}
t.__index = t

function t:sa(x)
    self.a = x
end

然后,调用函数:

t:sa(21)

t.sa( t, "some string this time?" )

答案 2 :(得分:0)

显然,这正是我所说的。

local a

function sa(a)
    self.a = a
end

答案 3 :(得分:0)

请记住,a:b(...)function a:b(...) ... end只是语法糖。 self不一定指向“当前对象”,因为与其他编程语言不同,self只是一个变量,可以分配给任何对象。请参见下面的示例进行演示:

function table:member(p1, p2)
 print(self, p1, p2)
end

就是

table.member = function(self, p1, p2)
 print(self, p1, p2)
end

table:member(1, 2)

就是

table.member(table, 1, 2)

因此

function table:member(self, p1, p2)
 print(self, p1, p2)
end

table:member(1,2) --self=1 p1=2 p2=nil

因为那只是

table.member = function(self, self, p1, p2)
 print(self, p1, p2)
end

table.member(table, 1, 2) --self=1 p1=2 p2=nil