概述:
Lua是一种动态类型的语言,在语言中没有类型定义的语法,每个值都“携带”了他自身的类型信息,我们可以用
type() 函数来检查起类型。
lua支持的类型:lua总共支持八种类型,分别是:
nil(空)、 boolLean(布尔)、 number(数字)、 string(字符串)、
table(表)、 functio(函数)、 userdata(自定义的类型)、 thread(线程)
类型详细介绍:
nil:空值,所有没有使用过的变量,都是nil。nil既是值,又是类型。
boolLean: 布尔值,在lua中false和nil为false 其他的都为true
number:数值,在Lua里,数值相当于C语言的double
string:字符串类型,在lua中字符串也是可以包括"\0"的
table:表类型,可以理解为数组
functio:函数类型,在lua中,函数也是一种类型,所以函数也会一个变量
userdata:用户类型,用来与宿主打交道,其可以是宿主的任意数据类型,常用的有struce和指针
thread:线程类型。
变量的定义
在Lua中,不管你在什么地方使用变量,都不需要声明,并且所有的这些变量总是全局变量,除非,你在前面 加
上"local"。这一点要特别注意,因为你可能想在函数里使用局部变量,却忘了用local来说明。至于变量名字,它的大
小写是相关的。也就是说,A和a是两个不同的变量。定义一个变量的方法就是赋值。"="操作就是用来赋值的。
下面定义几种常用类 型的变量
A. Nil
正如前面所说的,一个全局变量在第一次福之前的默认值就是nil。有时候我们也需要将一个变量清除,这时
候, 我们可以直接给变量赋以nil值。如:
var1=nil -- 请注意 nil 一定要小写
B. Boolean
布尔值通常是用在进行条件判断的时候。布尔值有两种:true 和 false。在Lua中,只有false和nil才被计算为
false,而所有任何其它类型的值,都是true。比如0,空串等等,都是true。不要被 C语言的习惯所误导,0在Lua中的
的确确是true。你也可以直接给一个变量赋以Boolean类型的值,如:
varboolean = true
C. Number
在Lua中,是没有整数类型的,也不需要。一般情况下,只要数值不是很大(比如不超 过100,000,000,000,000),是不会产生舍入误差的。在很多CPU上,实数的运算并不比整数慢。实数的表示方法,同C语 言类似,如:
4 0.4 4.57e-3 0.3e12 5e+20等等
D. String
字符串, 总是一种非常常用的高级类型。在Lua中,你可以非常方便的定义很长很长的字符串。
字符串在Lua中有几种方法来表示,最通用的方法,是 用双引号或单引号来括起一个字符串的,如:
"This is a string."
和C语言相同的,它支持一些转义字 符,列表如下:
\a 响铃
\b 退格 (back space)
\f 提供表格(form feed)
\n 换行(newline)
\r 回车(carriage return)
\t 水平tab(horizontal tab)
\v 垂直tab(vertical tab)
\\ 反斜杠(backslash)
\" 双引号(double quote)
\' 单引号(single quote)
left square bracket right square bracket
由于这种字符串只能写在一行中,因此,不可避免的要用到转义字符。加入了转义字符的串,看起来实在是
不敢恭维,比 如:
"one line\nnext line\n\"in quotes\", 'in quotes'"
一大堆 的"\"符号让人看起来很倒胃口。如果你与我有同感,那么,我们在Lua中,可以用另一种表示方法:用"[["和"]]"将多行的字符串括起来,如:
page = [[
<HTML>
<HEAD>
<TITLE>An HTML Page</TITLE>
</HEAD>
<BODY>
<A HREF="http://www.lua.org">Lua</A>
[[a text between double brackets]]
</BODY>
</HTML>
]]
值得注意的是,在这种字符串中,如果含有单独使用的"[["或"]]"就仍然得 用""或""来避免歧义。当然,这种情
况是极少会发生的。
string需要注意的几点:
lua中".."是字符串链接操作符,print("this is " .. "string") --> this is string 当直接在一个数字后面输入他的时候们必须用
一个空格来分隔开来,不然lua会将第一个点理解为小数点。
将字符串转换成数字 可以调用函数tonumber() print(tonumber("10") == 10) --->true
将数字转换成字符串时可以调用函数toString() print(tostrin(10) == "10") --->true
在lu a5.1版本中 在字符串前面放置操作符#来获取字符串的长度 print(#"this is string\0") --->15
E. Table
关系表类型,这是一个很强大的 类型。我们可以把这个类型看作是一个数组。只是C语言的数组,只能用正整数
来作索引;在Lua中,你可以用任意类型来作数组的索引,除了nil。同样,在 C语言中,数组的内容只允许一种类
型;在Lua中,你也可以用任意类型的值来作数组的内容,除了nil。
Table的定义很简单,它的主 要特征是用"{"和"}"来括起一系列数据元素的。比如:
T = {} -- 定义一个空表
T[1]=10 -- 然后我们就可以象C语言一样来使用它了。
T["John"]={Age=27, Gender="Male"}
这一句相当于:
T["John"]={} -- 必须先定义成一个表,还记得未定义的变量是nil类型吗
T["John"]["Age"]=27
T["John"]["Gender"]="Male"
当表的索引是字符串的时候,我们可以简写成:
T.John={}
T.John.Age=27
T.John.Gender="Male"
或
T.John{Age=27, Gender="Male"}
这是一个很强的特性。
如,前面的T的定义,我们可以这么写:
T=
{
10, -- 相当于 [1] = 10
[100] = 40,
John= -- 如果你原意,你还可以写成:["John"] =
{
Age=27, -- 如果你原意,你还可以写成:["Age"] =27
Gender=Male -- 如果你原意,你还可以写成:["Gender"] =Male
},
20 -- 相当于 [2] = 20
}
Table需要注意以下三点:
第一,所有元素之间,总是用逗号","隔开;
第二,所有索引值都需要用"["和"]"括起来;如果是字符串,还可以去掉引号和中括号;
第三,如果不写索引,则索引就会被认为是 数字,并按顺序自动从1往后编;
表类型的构造是如此的方便,以致于常常被人用来代替配置文件。是的,不用怀疑,它比ini文件要 漂亮,并且强大
的多。
F. Function
函数,在Lua中,函数的定义也很简单。典型的定义如下:
function add(a,b) -- add 是函数名字,a和b是参数名字
return a+b -- return 用来返回函数的运行结果
end
请注意,return语言一定要写在end之前。假如你非要在中间 放上一句return,那么请写成:
do
return
end。
还记得前面说过,函数也是变量类型吗?上面的函数定义,其实相当于:
add = function (a,b) return a+b end
当你重新给add赋值时,它就不再表示这个函数了。你甚 至可以赋给add任意数据,包括nil (这样,你就清除了add变量)。Function是不是很象C语言的函数指针呢?
和C 语言一样,Lua的函数可以接受可变参数个数,它同样是用"…"来定义的,比如:
function sum (a,b,…)
如果想取得…所代表的参数,可以在函数中访问arg局部变量(表类型)得到。
如 sum(1,2,3,4)
则,在函 数中,a = 1, b = 2, arg = {3, 4}
更可贵的是,它可以同时返回多个结果,比如:
function s()
return 1,2,3,4
end
a,b,c,d = s() -- 此时,a = 1, b = 2, c = 3, d = 4
G. Userdata 和 Thread
暂时没怎么用到过,留到日后来做好笔记。