您如何在带有 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
在 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
通过这种方式,您可以从其他实现多重继承的类中“借用”方法
请记住,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
显然,这正是我所说的。
local a
function sa(a)
self.a = a
end
这有点像你所说的那样,但是 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?" )