`
avenje
  • 浏览: 13095 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

(2)LUA程序设计-类型与值(type & value)

阅读更多

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',则此处不报错

 

 

 

梦之幻时尚睡衣纺 http://shop.paipai.com/442560143

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,加入请注明来源。

 

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics