![9e685372791fd17a67e3013fafc25984.png](https://img-blog.csdnimg.cn/img_convert/9e685372791fd17a67e3013fafc25984.png)
开局一段代码,后面内容全靠编:
do
local function get(self)
return self.count
end
local function inc(self)
self.count=self.count+1
end
function new_counter(value)
if type(value)~="number" then
value=0
end
local obj={
count=value,
get=get,
inc=inc
}
return obj
end
end
counter=new_counter(10)
print(counter:get())
counter:inc()
print(counter:get())`
咳咳,今天,教大家用上帝视角,创建一个计数器对象,实现两个功能,1.获取计数器用存储的值,2.使计数器里的值自增(就像调节钟表,按了一下+按键便加快了一秒)
现在,展开讲解---------
1.在do----end 构成的一个模块中,所有用local关键字定义的变量或函数都是局部的,否则是全局的。
2.
local function get(self)
return self.count
end
这段代码表示,建立一个名为get的局部函数,该函数仅在do---end构成的模块中起作用。get函数的用途是获取count(计数器)的值
3.
local function inc(self)
self.count=self.count+1
end
这段代码表示,建立一个名为inc的局部函数,该函数仅在do---end构成的模块中起作用。inc函数的用途是自增count(计数器)的值(每调用一次count自增1)
4.
function new_counter(value)
if type(value)~="number" then
value=0
end
local obj={
count=value,
get=get,
inc=inc
}
return obj
end
这段代码表示,建立一个名为new_counter的函数,该函数的作用域为全局作用域,该函数返回一个名为obj的表。
obj表中有三个成员变量,分别是count、get和inc,它们分别被赋值,其中count接收的是调用new_counter时所传递的一个初始值(count计数器的初始值);
get成员变量接收的是do----end块中局部函数get的地址,inc同上。
那么问题来了:counter=new_counter(10)代表什么意思呢?代表一个名为counter对象的创建!并且在创建的同时(或创建的那一瞬间~)就已将计数器的初始值赋予了10 (延伸解读:对象由类而来,是类的实例化!每实例化一个类的同时允许给该类的属性(本例为count)赋初值,使得每个对象天生就俱有不同的属性)
那么现在我们就要用一种全新的思维去理解:do----end 所组成的块,相当于是一个类(计数器类),由它创建的counter对象,包含两个方法和一个属性。
它们分别是get方法和inc方法(get和inc又可以称之为成员函数),以及一个数据成员count(用于存储计数器的值的变量),该数据成员又可以称之为对象的属性。
5.
print(counter:get())
counter:inc()
print(counter:get())
创建完对象counter后,当然就是使用对象办事情了(或者,搞事情?)
那么我们看一下,counter对象在本例中做了啥好事?
第一,它通过print函数输出了obj表中的count的值(即计数器的初始值)……潜台词:别忘了counter对象是由调用new_counter全局函数并返回该函数中的obj表的地址而构成!那么counter:get()就表示将obj表的地址传递给计数器类的成员函数get,get用self(本身之身)来接收obj表地址(或称counter对象地址),并返回本类中的成员属性count的值,所以counter:get()也可以写成:counter.get(counter) ,前者运用的是lua中的语法糖的效果------不懂啥叫语法糖,问下“度十娘” 。
所以所以,counter:get()的返回值便是:10 ------- 因为我们在创建counter对象时,已经将初始值10赋予了计数器对象的成员数据counter。旁白:"切记切记,对象由类而来,对象就是类的实例,就像你从人类而来,你是人类的一个实例(即具体的例子之意)"
6.
counter:inc()
print(counter:get())
我们利用counter:inc()来调用了对象中(或类中的……现在类即对象,对象即类,合二为一,就像圣经里宣传的那套:耶稣说,我父在我里面,我亦在我父里面)inc成员函数,那么inc成员函数(或称方法)实现了一个什么功能呢??? 是的没错,该方法实现了--------将计数器中存储的值自增1
于是(潜台词:如同上帝说,要有光,于是便有了光),计数器对象通过inc方法起作用了!快看,10要变成11了!
最后用print(counter:get()) ------ 用get方法将计数器的终值输出:10
没错!10代表满分,十全十美!上帝就这样创造了万物! 而你 ,你便是你所创造的程序世界中的上帝,你也能造出一个个对象,并利用对象中的方法来实现不同的功能!!!