对于Lua语言,一直以来我都觉得它很神秘。作为游戏开发中非常常用的脚本语言,它存在很多让人耳目一新的特性。最近学习了Lua编程,熟悉了C#之后,再来学习另一门语言其实不是很吃力。
Lua的内容也很多,不过没有必要写的太详细,所以学习总结只是对比C#语言来看看Lua有什么不同之处。
1.注释和debug
Lua中单行注释使用 -- 多行注释则使用--[[ 这里是注释 --]]
输出debug的话就很熟悉了:print(),和Unity 3D中的控制台输出print()以及Debug.Log()相同
2.标示符命名规则
变量、方法的命名,按照我们现在使用的驼峰命名法是没有问题的,下划线尽量不要配合大写字母使用也是没有问题的。
3.数据类型
在C#中有15中内置类型:
整型:sbyte、byte、short、ushort、int、uint、long、ulong;
浮点型:float、double;
decimal类型:更高精度的浮点型,至今没有用到过;
bool类型;
字符型:char;
object类型;
string类型;
然而在Lua中,数据类型就很简单了:
string类型:表示字符串
boolean类型:true和false
nil类型:空类型表示一个无效值,可用在bool判断中,与C#中的null类似;
number类型:表示数字
function类型:编写的函数,函数也可以作为一个类型,因此可以把函数当成值来传递,与C#中的委托遥相呼应;
table类型:同时拥有C#中字典和List类的特性,现阶段可以理解它是一个数组。
thread类型:用于执行协同程序
userdata类型:我们可以类比C#中的结构体来理解,用户可以自己定义属性的类型。
4.变量的声明
与C#不同的是,Lua中变量的声明不需要指定其类型,变量的类型随着值的变化而变化。所以我们可以说Lua是个类型不安全的语言。
既然声明的时候没有指定类型,那么变量的初始值就统一为nil,不像C#中int的初始值为0,string的初始值为" "。
5.Lua中的字符串
Lua中的字符串可以设置多行,使用[[ ]]包裹起来即可
C#中通过字符串的.length()方法获取字符串的长度,而Lua中可以使用 #"xxxxxx" 来获取,这个语句会返回一个number类型的数字,数字的大小就是双引号内字符串的长度。
C#中可以通过+来拼接字符串,但是在Lua中是行不通的。
"2"+"3"、2+"3"都会得到number类型的数字5,也就是说加号+只用于number类型。"num"+"ber"会报错。Lua中是通过下面的形式来拼接字符串的:
"num".."ber"
"user"..1
6.table表
table表的声明就不用说了,很简单。值得注意的是table表中元素是以key-value键值对的形式存在的。同时也就弱化了table中索引的概念,Lua中的索引是从1开始的,table中的key一般使用number类型或者string类型。
Lua中的for循环一般是这样使用的:
tab1={}
for i=0,10 do
tab1[i]=i
end
for key,val in pairs(tab1) do
--TODO
end
看起来很奇怪,写多了就适应了。
对于table,还有一个问题就是删除一个元素,后面的元素不会向前移动,也就是说删除中间一个元素后的table,索引不是连着的。
7.nil的用法
当给一个变量赋值nil后,不仅变量值为空,所占用的内存也会被清空。
8.function的用法
无论是for还是function,程序块的结束是以end为结尾的:
function fun(n)
if n==1 then
print("n=1")
else
print("n=0")
end
end
上面的代码包括了带参函数的声明,也包含了Lua中if的用法,都很简洁,也很简单。
要注意一点的是直接声明的变量默认是全局变量,要声明局部变量需要在前面加上local变量
function fun2()
b=0
local a="a"
end
fun2()
print(b)
print(a)
上面这段代码最终输出的结果为:
但是如果我们在输出之前不执行这个方法,运行结果就会不一样了:
function fun2()
b=0
local a="a"
end
print(b)
print(a)
运行结果:
两次输出都是nil,为什么b定义成全局变量,而且已经赋值了,还是nil?
这就是动态语言的特性。
动态语言没有编译的过程,方法定义了之后被调用执行了之后,方法里面的代码才会被执行,只有fun2被调用,b才被定义,否则的话都是没有被声明定义,自然是nil了。
我们之前说function是一个类型,为什么这么说呢?我们来看看一个骚操作:
就问你6不6?
这年头方法都跟变量一起同流合污了,啥都干。
不过现阶段的了解来看,意义不大,直接调用不好吗?非得这么骚包的再赋值?
9.变量的赋值
我们在C#中经常可以用到一行声明多个同类型变量:
int score,age,id;
然而,Lua中不仅可以一行声明多个变量,还能同时给多个变量赋值:
a,b,c=1,"num",true
print(a,b,c)
a,b,c=1,"num"
print(a,b,c)
a,b,c=1,"num",true,0
print(a,b,c)
运行结果:
原则是这样的:当值的个数大于变量的个数时,多余的值会被忽略;当值的个数小于变量的个数时,多余的变量值为nil,至于个数相等,你等的哦。
同时,Lua中竟然还有这种操作:
Lua的文档解释是这样的:当进行=的赋值操作时,系统会优先计算等号右侧并得到值,然后再赋值给左侧。
不知道以后面试的时候面试官让我不通过第三变量来交换两个变量的值的时候我这样写会不会被打死。。。
然后呢,我们再来看看赋值的时候还有什么骚操作:
直接返回了两个值,不跟你多罗嗦,就是这么简单粗暴!
一开始觉得Lua其实挺麻烦的,很多东西都没有必要。随着学习的进行,反而觉得很灵活很方便。是C#先入为主了,不知不觉中固定了思维,以后学习要开拓思维,掌握更多的程序设计思想。
老规矩:有任何疑问或错误,欢迎大家指正!谢谢。