Lua自我引用

Sna*_*ybo 6 lua this self

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

就像在Java中一样,你有:

private int a

public void sa(int a) { this.a = a}
public void ga() { return this.a }
Run Code Online (Sandbox Code Playgroud)

VB有'我'而C#有'这个'等.

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

local a

function sa(a)
    self.a = a
end
Run Code Online (Sandbox Code Playgroud)

小智 12

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

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

  function table.member(self,p1,p2)
  end
Run Code Online (Sandbox Code Playgroud)

要么

  function table:member(p1,p2)
  end
Run Code Online (Sandbox Code Playgroud)

要么

  table.member = function(self,p1,p2)
  end
Run Code Online (Sandbox Code Playgroud)

现在,是棘手的部分:

调用

table:member(1,2)
Run Code Online (Sandbox Code Playgroud)

你得到:

自表=,P1 = 1,P2 = 2

调用

table.member(1,2)
Run Code Online (Sandbox Code Playgroud)

你得到:

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

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

table.member(othertable,1,2)
Run Code Online (Sandbox Code Playgroud)

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

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


hjp*_*r92 0

有点像你所说的那样,但 OOP 方法有点不同。下面是实际的方法。

local t = {
    a
}
t.__index = t

function t:sa(x)
    self.a = x
end
Run Code Online (Sandbox Code Playgroud)

然后,调用该函数:

t:sa(21)
Run Code Online (Sandbox Code Playgroud)

或者

t.sa( t, "some string this time?" )
Run Code Online (Sandbox Code Playgroud)

  • Lua 中不存在“真正的”OOP 方法,因为它没有定义任何 OOP 限制,Lua 在远程 OOP 方面提供的唯一东西是 `table:method()` 的语法糖。构造“local t = { a }”将创建一个空表,除非定义了变量“a”,在这种情况下,变量“a”的值将写入表的索引“1”处。顺便说一句,如果没有“setmetatable”,“__index”键就没用了。 (2认同)