你是如何在自己的程序中获得变量的?
与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
答案 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