先上一个观看的视频: https://www.bilibili.com/video/av8117759
1,函数式,面向过程,面向对象。以lua为例子
按照作者的视频的观点,函数式:以闭包为主要操作的语言。
1,函数式:
1,闭包-函数式语言的特征
1.1函数的副作用
exp1:交换2个参数的值。
有副作用:改变了函数参数的值。function f1(x,y){tmp =x, x=y,y=tmp,return x,y }
没有副作用:不会改变函数参数的值。function f1(x,y){x1=y,y1=x,return x1,y1 }
1.2闭包,没有副作用的函数。
exp1:
function f1(x){//参数x默认会当成局部变量传递。
function f2(y) return x + y ;
return f2;
}
tmp_f2 = f1(10)
tmp_f2(20)
结果为:30
在这里,x的值看似是自由改变的,其实x是被限定死的。
类似的如:
function f1(){
local i = 0//如果i不加local,那tmp_f2与其他tmp_f共享这个i,且每次调用f1()时,i的值会执行=0.
return function (){ return i=i+1; }
}
tmp_f2 = f1()
tmp_f2()
每次调用,返回值依次+1,即:返回值为:1,2,3,4,5。
2,面向过程
面向过程
a1 = {1,2}
a2 = {2,3}
a3 = add(a1,a2)
3,面向对象
//类
function ClassA(a,b){
local x = a
local y = b
function add(objTmp){
x = x+objTmp.getX()
y = y+objTmp.getY()
return x , y
}
function getX(){
return x
}
function setX(valueX){
x = valueX
}
return add,getX,setX //返回一个表
}
//继承
function ClassA_child(a,b){
local A_obj = ClassA(a,b)
function mul(objTmp){
A_obj.setX(A_obj.getX()*objTmp.getX())
}
return A_obj.add,A_obj.getX,A_obj.setX,mul //返回一个表
}
面向对象数据操作:
a1 = ClassA(1,2)
a2 = ClassA(2,3)
a3 = a1.add(a2)
面向过程数据操作:
a1 = {1,2}
a2 = {2,3}
a3 = add(a1,a2)
作者举了知乎上一个例子:形容狗吃屎。
面向对象是:gou.chi(shi)
面向过程:chi(gou,shi)
写lua时暂时记录的Tips:
tips1:
a={1,2}
b=a
a和b是2个互不相干的表。
tips2:
lua的self和t是2个表,有不同的地址和数据。