c 通过成员变量地址 获取类对象地址_果壳疯狂编程-上帝视角(开篇):lua的面向对象写法...

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值