[置顶] (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',则此处不报错

                 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)
(3)LUA程序设计-表达式与语句(expression & statement)(2012-07-29 22:51)      
(4)LUA程序设计-函数及深入理解(function)(2012-08-03 23:00)      
(5)LUA程序设计-迭代器(state iterator & stateless iterator)(2012-08-06 23:05)
(6)LUA程序设计-编译执行与错误(compile 、run & error)处理(2012-08-11 00:05)
(7)LUA程序设计-协同程序(coroutine)(2012-09-01 00:06)
   

       





你可能感兴趣的:(JavaScript,thread,String,function,lua,语言)