1.介绍
LUA程序语言,它是一种动态(弱)类型的语言,没有类型定义的语法,它包含八种不同的基本(原子)类型
[
nill空,boolean布尔,number数字,string串,userdata用户自定义数据,function函数,thread线程,talbe表
],
每一个变量都可以包含任何类型(举例如下)。
比如,v = 'abc‘ -- 将V初置值为字符串‘abc’
print(type(v)) -->'string' ,type是一个lua 自带的函数,作用跟JAVASCRIPT里边的type函数,返回传入参数的类型字符串,所以下面的print(type(type(v)))结果是‘string’
v = nill --v重新置值为nill
print(type(v)) -->'nill'
print(type(type(v)))-->'string'
Lua将函数function作为第一类值处理,可以像操作其他值一样来处理函数值,如下
v = print --将函数掼针置给变量v
v(type(v))--'function' ,等价于print(type(print))
2.详细介绍8种数据类型
2.1 nil
删除一个全局变量时,只需要将变量置为nill即可,nill只有一个值,表示一种‘无效值’的意义,被视为‘假’,在lua里,只有nill,false被视为‘假’其他一律都视为‘真’
2.2 boolean
只有true和false 两种状态,在lua,并不是只有boolean可以作为条件值的唯一表示形式,所以类型的值都可以作为条件判断,如上面所说的,只有nill,false被视为‘假’其他一律都视为‘真’
2.3number
数字类型,用于表示实数。LUA并没有整数类型,只是用双精度浮点数作表示一个整数,(可以通过修改LUA发行版本目录下的luaconf.h,重新compile lua源码,可以使用其他类型如double,float类型)
合法的数字常量如:8 8.8 8.808e-8 0.8e3 5e+30等
2.4string
2.4.1
lua字符串,表示一个字符序列,采用8-bit coding,字符中的字符可以是任何数值编码,如0,即可以将二进制数据存到一个字符串里。
2.4.2
lua的字符串,是一种不可变的值,不能修改其中的某个或某些字符,修改只能通过创建新的变量来存修改后的字符串,原来的字符串并不会被修改,如下例
a = "this is the first string"--lua字符串常量可以用双引或单引号界定,与javascript语言一样
b = string.gsub(a,'first','second')--创建新变量b来存修改后的字符串,string.gsub表示调用string table里边的gsub方法,该方法表示将用seconde,替换掉原串当中的first
print(a) -->"this is the first string"
print(b) --"this is the second string"
2.4.3 转义序列
跟C语言差不多,LUA有自己的转义序列, 如\a \b \f \n \r \t \ddd \odd \xdd等
除了‘单引号,“双引号外,还可以[[ string content ]]类似块注释的方式来界定字符串,这种方式不会解释string content里边的转义序列字符,如果第一行为空白行,将会被忽略,如下
stringValue = [[
--空白行,将被忽略
<html>
<head>
<title>lua test</title>
</head>
<body>
asdf;js\nt\tafksa
;jafdaa'\'
</body>
</html>
]]
除了[[ string content ]]这种形式,有时为了怕字符串被当作注释给注释掉,所以建议以下面的形式块界定
[--{n}[ string content ]--{n}]
注:--{n},如n=1,[--{n}[ string content ]--{n}] 相当于 [-[ string content ]-];n=2,则表示[--[ string content ]--],依次类推
2.4.4 字符串与数字的算术运算转换
lua提拱了运行时数字与字符串的自动转换,当然有时候会出报错,只有当字符串是“数字类弄型值”,才能自动转换算成功
如: print('88'+8);-->96,将string 类型转成number类型 ,最后计算88+*=96
print(type('88'+8));-->number
print("-8.1e+8"*2)-->16.2e+8
但当字符串不是“数字类弄型值”,如‘hello’
print('hello'+1)--出错了
2.4.5字符串连接符 ..
用于连接字符串与字符串,数字与数字,以及数字与字符串
print('hello'..' world')--> hello world
print(20..12) -->报错了,如果第一个是数字,不在.与数字之间加一空间,lua解释会将.解释成数字的小数,所以只需要在第一个数字与.之间加一空格即可
print('hello'..2012) -->hello2012
通过..连接成后,数据类型变成string
print(type(20..12)) --> 'string'
2.4.6 字符串与数字类型的互相转换
lua提供tonumber()方法,可以将“数字类弄型值”的字符串变量变成数字类型,如果转换失败会返回nil;
除了以上介绍的。。字符串连接符外,LUA提供tostring()方法也可以将数字类型转成string
2.4.7 求字符串长度#
直接例子
a = 'hello'
print(#a);-->5
print(#'helloworld')-->10
2.5 table
2.5.1
作为LUA的核心数据类型,table类型实现了动态(长度可变性)“关联数组”,一种具有特列索引的关联数组,不仅可以通过整数索引,还可以用其他基本类型的值(除NIL外)去索。
2.5.2
table可以表示普通数组,符号表,集合,记录,队列和其他数据结构。(table普通数组/线性表,通常以1为索引开始值)
在lua当中,table起着相当重要的作用,lua用table 表示模块,包,还用对象。简单地说明,如io.read,表示用read去索引 io模块的read函数,io表示输入输出模块。
table 的创建不需要声明,只需要通过construtor expression来完成,如 a = {}就定义了一个空表。看下面例子
t = {} --创建一个空表t
k = 'fuck' --定义一个字符串变量,并置值
t[k] = 'you' --为t表添加新索引k,并置值 key='fuck' ,value='you',用字符串索引
t[8] = ‘happy’ --新添加索引8, 用数字索引
print(t['fuck']) -->fuck
print(t[8])-->happy
k = 8
print(t[k])-->happy
lua中的table 永远是匿名的,持有table的变量与它自身没有固定的关联,table变量相当于java当中的引用,举例
a = {} --创建空表
a['aven'] = 2012--添加索引条目
b = a --将b也指向a所指向的table
print(b['aven']) -->2012
删除table,只需要将其置为nil即可
接上面,a = nil--现在只有b引用table了。
2.5.3
lua提供了“语法糖”,对于t['key'],可以简化为t.key 这样的写法,然而,并不是所有的t['key']等价于t.key;只有当table表的索引是字符串类型值时,才可以用点语法的形式简化写法,如果是数字类型的话,则不行。
最后要提一下a.x 与a[x]的区别:前者以'x'作为table a表的索引,而后都以变量x的值为索引,举例
k = 'key'
t = {}
t[k] = 'value'
print(t[k]) -->value ,等价于print(k['key'])
print(t.k) --报错了,找不到'k'这个字符串,如果将第一行代码,改成k= 'k',则此处不报错
2.5.4
综合举例操作table
1.读取 文件前十行,保存到t表当中
方法一:
t = {}
for i=1,10 do
t[i] = io.read()
end
方法二:
t = {}
for i =1,10 do
t[#t+1] = io.read()
end --利用#长度计算符
2.将上例当中的最后一行置换成别的新值,如‘fuck you’
t[#t] = nil
t[#t+1] = 'fuck you'
2.5.5
table是可变大小的,但是其大小的概念比较模糊
t = {}
t[10000] = 8;
上面的t表出现了空隙,在lua 的table当中,所有未初始化的变量的索引结果都是nil,所以前面1-9999都是nil,而#长度运算符只求出到,第一个为nil前面的数组的长,所以上面的#t = 0,lua提供table.maxn(t)可以求出最大正索引数,所以上面的table.maxn(t)确良=10000
最后, 可以通过if(#t ==table.maxn(t))来判断该 t表是否存在空隙。
2.6 function
前面讲到,lua将function作为first-class value来处理,如a = print a(type(a)) 等价于print(type(print))
lua即可以调用lua编写的函数,也可以调用标C语言写的函数,LUA库是用C写的,后面将介绍各种常见库,如io/os/math/debugger等
关于函数的介绍,将在下面进行深入学习
2.7userdata & thread
讲到协同的时候,我们再讲thread
而userdata,是用来定义将C语言数据保存到LUA变量当中的,它是一种新型类型,如在标准I/O库内,用userdata 表示文件。
下一节,将讲解--表达式与语句(expression & statement)
LUA技术交流群,请加Q群:139315537,加入请注明来源。
(1)LUA程序设计-开篇(beginning)(2012-07-28 00:47) (2)LUA程序设计-类型与值(type & value)(2012-07-28 23:12)
|