• 新浪微博:
  • 微信 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:03-18

按键精灵安卓版
立即下载

软件版本:3.3.8
软件大小:62.5M
更新时间:12-18

按键精灵iOS版
立即下载

软件版本:1.7.1
软件大小:29.2M
更新时间:06-22

最新企业版UiBot
立即下载

软件版本:3.3
软件大小:282M
更新时间:08-06

快捷导航

登录 后使用快捷导航
没有帐号? 注册

登录 注册
发新话题 回复该主题

果壳疯狂编程-上帝视角(开篇):lua的面向对象写法 [复制链接]

1#

开局一段代码,后面内容全靠编:

  1. do

  2. local function get(self)

  3. return self.count

  4. end

  5. local function inc(self)

  6. self.count=self.count+1

  7. end

  8. function new_counter(value)

  9. if type(value)~="number" then

  10. value=0

  11. end

  12. local obj={

  13. count=value,

  14. get=get,

  15. inc=inc

  16. }

  17. return obj

  18. end

  19. end

  20. counter=new_counter(10)

  21. print(counter:get())

  22. counter:inc()

  23. print(counter:get())`
复制代码

咳咳,今天,教大家用上帝视角,创建一个计数器对象,实现两个功能,1.获取计数器用存储的值,2.使计数器里的值自增(就像调节钟表,按了一下+按键便加快了一秒)


现在,展开讲解---------


1.在do----end 构成的一个模块中,所有用local关键字定义的变量或函数都是局部的,否则是全局的。

2.

  1. local function get(self)

  2. return self.count

  3. end
复制代码

这段代码表示,建立一个名为get的局部函数,该函数仅在do---end构成的模块中起作用。get函数的用途是获取count(计数器)的值

3.

  1. local function inc(self)

  2. self.count=self.count+1

  3. end
复制代码

这段代码表示,建立一个名为inc的局部函数,该函数仅在do---end构成的模块中起作用。inc函数的用途是自增count(计数器)的值(每调用一次count自增1)

4.

  1. function new_counter(value)

  2. if type(value)~="number" then

  3. value=0

  4. end

  5. local obj={

  6. count=value,

  7. get=get,

  8. inc=inc

  9. }

  10. return obj

  11. 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.

  1. print(counter:get())

  2. counter:inc()

  3. 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.

  1. counter:inc()

  2. print(counter:get())
复制代码

我们利用counter:inc()来调用了对象中(或类中的……现在类即对象,对象即类,合二为一,就像圣经里宣传的那套:耶稣说,我父在我里面,我亦在我父里面)inc成员函数,那么inc成员函数(或称方法)实现了一个什么功能呢??? 是的没错,该方法实现了--------将计数器中存储的值自增1

于是(潜台词:如同上帝说,要有光,于是便有了光),计数器对象通过inc方法起作用了!快看,10要变成11了!

最后用print(counter:get()) ------ 用get方法将计数器的终值输出:10

没错!10代表满分,十全十美!上帝就这样创造了万物! 而你 ,你便是你所创造的程序世界中的上帝,你也能造出一个个对象,并利用对象中的方法来实现不同的功能!!!


最后编辑果壳王子 最后编辑于 2020-03-31 22:23:03
本主题由 按键合作伙伴 果壳王子 于 2020/3/31 22:07:57 执行 移动主题 操作
果壳学院 ● 疯狂编程 QQ交流群: 327610461 (编程要从娃娃抓起)

  果壳热编程教育网:www.guokeHOT.com ←点击登录,即刻学习!

发新话题 回复该主题