lua学习(一)

 1 - 词法约定

Lua 中用到的 名字(也称作 标识符)可以是任何非数字开头的字母、数字、下划线组成的字符串。

下面的关键字是保留的,不能用作名字: 

     and       break     do        else         elseif
     end       false      for       function    if
     in           local       nil       not           or
     repeat    return    then      true      until     while
   

Lua 是一个大小写敏感的语言

符号:

+   -   *   /   %   ^   #   ==  ~=   <=   >=     <     >    =  ( )    { }    [ ]   ;   :    ,   .    ..    ...

字符串既可以用一对单引号引起,也可以是双引号,里面还可以包含类似 C 的转义符: '\a' (响铃), '\b' (退格), '\f' (表单), '\n' (换行), '\r' (回车), '\t' (横向制表), '\v' (纵向制表), '\\' (反斜杠), '\"' (双引号),以及 '\'' (单引号)。

2 - 值与类型

Lua 是一种 动态类型语言。这意味着变量没有类型,只有值才有类型。

Lua 中的所有值都是一致 (first-class) 的。这意味着所有的值都可以被放在变量里,当作参数传递到另一个函数中,并被函数作为结果返回。

Lua 中有八种基本类型: nil, boolean, number, string,function,userdata,thread, table.

 

Nil 类型只有一种值 nil ,当需要描述一个无意义的值时会用到它。

Boolean 类型只有两种值:false 和 true。 nil 和 false 都能导致条件为假;而另外所有的值都被当作真。

Number 表示实数(双精度浮点数)。

String 表示一串字符的数组。 Lua 是 8-bit clean 的:字符串可以包含任何 8 位字符,包括零结束符 ('\0')

userdata 类型用来将任意 C 数据保存在 Lua 变量中。这个类型相当于一块原生的内存,除了赋值和相同性判断,Lua 没有为之预定义任何操作。然而,通过使用metatable (元表) ,程序员可以为 userdata 自定义一组操作。userdata 不能在 Lua 中创建出来,也不能在 Lua 中修改。这样的操作只能通过 C API。这一点保证了宿主程序完全掌管其中的数据。

thread 类型用来区别独立的执行线程,它被用来实现 coroutine (协同例程)。Lua 可以在所有的系统上提供对 coroutine 的支持,即使系统并不支持线程。

table 类型实现了一个关联数组。也就是说,数组可以用任何东西(除了nil)做索引,而不限于数字。table 是 lua 中唯一的一种数据结构;它可以用来描述原始的数组、符号表、集合、记录、图、树、等等。

table, function ,thread ,和 (full) userdata 这些类型的值是所谓的对象:变量本身并不会真正的存放它们的值,而只是放了一个对对象的引用。赋值,参数传递,函数返回,都是对这些对象的引用进行操作;这些操作不会做暗地里做任何性质的拷贝。

 

3 - 变量

Lua 中有三类变量:全局变量,局部变量,还有 table 的域。

任何变量都被假定为全局变量,除非显式的以 local 修饰定义 。局部变量有其作用范围:局部变量可以被定义在它作用范围中的函数自由使用。

对全局变量以及 table 域之访问的含义可以通过 metatable 来改变。以取一个变量下标指向的量 t[i] 等价于调用 gettable_event(t,i)

Table
    关系表类型,这是一个很强大的类型。我们可以把这个类型看作是一个数组。只是C语言的数组,只能用正整数来作索引;在Lua中,你可以用任意类型来作数组的索引,除了nil。同样,在C语言中,数组的内容只允许一种类型;在Lua中,你也可以用任意类型的值来作数组的内容,除了nil。
    Table的定义很简单,它的主要特征是用"{"和"}"来括起一系列数据元素的。比如:
                T1 = {}  -- 定义一个空表
    T1[1]=10  -- 然后我们就可以象C语言一样来使用它了。

                T1["John"]={Age=27, Gender="Male"}
    这一句相当于:
    T1["John"]={}  -- 必须先定义成一个表,还记得未定义的变量是nil类型吗
    T1["John"]["Age"]=27
    T1["John"]["Gender"]="Male"
    当表的索引是字符串的时候,我们可以简写成:
    T1.John={}
    T1.John.Age=27
    T1.John.Gender="Male"
    或
    T1.John{Age=27, Gender="Male"}
    在定义表的时候,我们可以把所有的数据内容一起写在"{"和"}"之间,这样子是非常方便,而且很好看。比如,前面的T1的定义,我们可以这么写:

                T1=
    {
      10,  -- 相当于 [1] = 10
      [100] = 40,
      John=  -- 如果你原意,你还可以写成:["John"] =
      {
        Age=27,   -- 如果你原意,你还可以写成:["Age"] =27
        Gender=Male   -- 如果你原意,你还可以写成:["Gender"] =Male
      },
      20  -- 相当于 [2] = 20
    }


               看起来很漂亮,不是吗?我们在写的时候,需要注意三点:
    第一,所有元素之间,总是用逗号","隔开;
    第二,所有索引值都需要用"["和"]"括起来;如果是字符串,还可以去掉引号和中括号;
    第三,如果不写索引,则索引就会被认为是数字,并按顺序自动从1往后编;

Function
    函数,在Lua中,函数的定义也很简单。典型的定义如下:

                function add(a,b)  -- add 是函数名字,a和b是参数名字
     return a+b  -- return 用来返回函数的运行结果
       end
             还记得前面说过,函数也是变量类型吗?上面的函数定义,其实相当于:

               add = function (a,b) return a+b end
              重新给add赋值时,它就不再表示这个函数了。我们甚至可以赋给add任意数据,包括nil (这样,赋值为nil,将会把该变量清除)。

    和C语言一样,Lua的函数可以接受可变参数个数,它同样是用"..."来定义的,比如:function sum (a,b,)
    更可贵的是,它可以同时返回多个结果,比如:

                function s()
      return 1,2,3,4
    end
    a,b,c,d = s()  -- 此时,a = 1, b = 2, c = 3, d = 4
               前面说过,表类型可以拥有任意类型的值,包括函数!因此,有一个很强大的特性是,拥有函数的表。Lua可以使用面向对象编程,举例如下:

                 t =
    {
     Age = 27
     add = function(self, n) self.Age = self.Age+n end
    }
    print(t.Age)  -- 27
    t.add(t, 10)
    print(t.Age)  -- 37

                   不过,t.add(t,10) 这一句实在是有点土对吧?没关系,在Lua中,我们可以简写成:

                   t:add(10)    -- 相当于 t.add(t,10)

 

 4-控制语句

语句                                                              格式                                                                                           示例

if                                          if 条件 then ... elseif 条件 then ... else ... end                                         if 1+1=2 then print("true")
                                                                                                                                                                         elseif 1+2~=3 then print("true")
                                                                                                                                                                         else print("false"end

 

 while                                   while 条件 do ... end                                                                                   while 1+1~=2 do print("true"end

 

Repeat                                repeat ... until 条件                                                                                       repeat print("Hello"until 1+1~=2

 

For                                     for 变量=初值, 终点值, 步进 do ... end                                                      for i = 1102 do print(i) end

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值