7

您如何在带有 self 的程序中获得变量?

就像在 Java 中一样,你有:

private int a

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

VB 有“ME”,C# 有“this”等。

但是这个 Lua 等价物是什么?这是在正确的方向吗?

local a

function sa(a)
    self.a = a
end
4

4 回答 4

15

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

要声明一个类成员,您可以使用这个完全等效的语法

  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=nil

换句话说,它:模仿了一个真实的类,而.更像是一个静态的使用。好消息是您可以混合使用这两种样式,例如:

table.member(othertable,1,2)

自我=其他表,p1=1,p2=2

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

于 2013-06-23T18:00:03.343 回答
3

请记住,a:b(...)andfunction 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
于 2019-04-08T19:37:11.737 回答
0

显然,这正是我所说的。

local a

function sa(a)
    self.a = a
end
于 2013-06-22T22:38:05.397 回答
0

这有点像你所说的那样,但是 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?" )
于 2013-06-22T22:50:01.357 回答