Lua 的 self 引用

如何在程序中使用 self 获取变量?

在 Java 中,你可以这样写:

private int a;

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

public int ga() { 
    return this.a;
}

VB 中可以用 'ME',C# 中可以用 'this' 等等。

那么在 Lua 中该怎么做?以下方法是否正确呢?

local a

function sa(self, a)
    self.a = a
end
点赞
用户2078393
用户2078393

显然,这正是我所说的。

local a

function sa(a)
    self.a = a
end
2013-06-22 22:38:05
用户1190388
用户1190388

这与您说的有点相似,但 OOP 方法略有不同。以下是实际方法。

local t = {
    a
}
t.__index = t

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

然后,要调用函数:

t:sa(21)

或者

t.sa( t, "这次是一些字符串?" )
2013-06-22 22:50:01
用户1130744
用户1130744

在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)

你会得到:

self=table,p1=1,p2=2

调用

table.member(1,2)

你会得到:

self=1,p1=2,p2=nil

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

table.member(othertable,1,2)

结果是:

self=othertable,p1=1,p2=2

这样你就可以从其他类中"借用"方法来实现多重继承。

2013-06-23 18:00:03
用户2162852
用户2162852

请记住, 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
2019-04-08 19:37:11