抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Lua语言入门01

参考文档:博客园:Lua ===> Lua 十分钟基础入门上手

一、Lua简介

Lua维基百科

  • Lua的目标是成为一个很容易嵌入到其他语言中使用的语言;
  • 很多程序员使用Lua作为自己的嵌入式脚本语言,实现可配置性,可扩展性;
  • 轻量级语言,体积小速度启动快,只包含一个精简的核心和基本的库;
  • Lua很容易的被扩展,由宿主语言提供网络通讯,图形界面等功能;
  • Lua是一个动态弱类型语言,支持增量式垃圾收集策略。有内建的,与操作系统无关的协作式多线程(coroutine)支持;
  • 我们可以用其特有的表结构(Lua唯一提供的复杂数据结构)轻易模拟继承、命名空间、类等概念的实现;
  • Lua原生支援的数据类型非常之少,它只提供了数字(缺省是双精度浮点数,可配置)、布尔量、字符串、表、子程序、协程(coroutine)以及用户自定义数据这几种。但是其处理表和字符串的效率非常之高,加上元表的支援,我们可以高效的模拟出需要的复杂数据类型(比如集合、数组等)。

二、语法基础

在Lua中,一切都是变量,除了关键字

  • 注释

    1
    2
    3
    4
    5
    6
    --单行注释用两个减号标记

    --[[
    多行注释:
    用减号和两个方括号
    ]]
  • 语句分隔

    语句之间可以用半角分号;表示结束,也可以用空白分隔!如:

    1
    print("Hallo world!")
  • 语句块

    语句块在多数语言中是用{}括起来的,在Lua中,它是用doend括起来的。比如:

    1
    do print("Hello") end

    你可以在 函数中和语句块中定义局部变量。

  • 条件控制语句

    可以用break终止循环;

    循环条件不用括号括起来;

    • if else循环

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      if (条件) then
      ...
      end

      if 条件 then
      ...
      else if 条件 then
      ...
      else ...
      ...
      end
    • while循环

      1
      2
      3
      while 条件 do
      ...
      end
    • repeat循环

      1
      2
      3
      repeat
      ...
      until 条件
    • for循环

      1
      2
      3
      4
      5
      6
      7
      for 变量=初值,终点值,步进值 do
      ...
      end

      for 变量1, 变量2, ..., 变量n, in表或枚举函数 do
      ...
      end

      循环体内的变量也是局部变量;

      步进值若省略则自动使用默认值1

  • 赋值语句

    定义一个变量的方法就是赋值,操作符就是用来赋值的,在Lua中赋值语句更方便:

    1
    2
    3
    a,b,c = 1,2,3	--相当于a=1 b=2 c=3

    a,b = b,a --交换ab的值

    当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:

    a. 变量个数 > 值的个数 –按变量个数补足nil

    b. 变量个数 < 值的个数 –多余的值会被忽略

    如:

    1
    2
    3
    4
    5
    6
    7
    a, b, c = 1, 2
    print(a, b, c)
    >1 2 nil

    a, b = 4, 5, 6, 7
    print(a,b)
    >4 5

    Lua语言的函数返回值可以不止一个,因此可以用函数给多个变量赋值:

    1
    a, b, c = function01()		--function01()函数返回三个值依次赋给abc
  • 数值运算符

    和C语言一样,支持+-*/,此外还有整除运算符//(Lua版本>=5.3)。

    在Lua中,/运算是会包含小数部分的,//才能整除。

    但Lua还多了一个^,这表示指数乘方运算。比如2^3结果为82^4结果为16

    连接两个字符串,可以用”..”运处符。如:

    1
    "This a " .. "string."		--结果为:"This a string."
  • 比较运算符

    <小于,>大于,<=不大于,>=不小于,==相等,~=不相等,这些操作符的运算结果只有truefalse

    对于TableFunctionUserdata类型的数据,只能进行==~=,二者都判断引用的是否是同一份数据,如:

    1
    2
    3
    a={1,2}; b=a; c={1,2}
    print(a==b, a~=b) --true, false
    print(a==c, a~=c) --false, true
  • 逻辑运算:andornot

    注:在Lua中,只有false和nil才计算为false,其它任何数据都计算为true,0和空串也是true!

    • a and b:如果afalse,则返回a,否则返回b
    • a or b:如果atrue,则返回a,否则返回b
    • not取反,相当于!!条件,条件为真返回假,条件为假返回真。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    print(4 and 5)		--5
    print(nil and 13) --nil
    print(false and nil) --false
    print(4 or 5) --4
    print(false or 12) --12
    --[[
    我们可以模拟C语言中的语句:x = a? b : c,在Lua中,可以写成:x = a and b or c。
    最有用的语句是: x = x or v,它相当于:if not x then x = v end 。
    ]]
  • 运算符优先级

    运算符优先级,从高到低顺序如下:
    ^
    not- (一元运算)
    */
    +-
    ..
    <><=>=~===
    and
    or

  • 关键字

    关键字是不能做为变量的。Lua的关键字不多,就以下几个:

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

三、数据类型

  • 在Lua中,不管你在什么地方使用变量都不需要声明,并且所有的这些变量总是全局变量,除非,你在变量名前加上local
  • 变量名字大小写相关,如Abb和abb是两个不同的变量。
  • 可以用type()函数来检查变量是什么类型,该函数返回的是类型名称的字符串。

1、Nil类型

nil类型表示一种没有任何有效值,它只有一个值nil,如果打印一个没有赋值的变量,便会输出一个nil值。

换句话说,当且仅当一个变量不等于nil时,这个变量即存在。

对于全局变量和tablenil还有一个“删除作用”,给全局变量或者table表里的变量赋一个nil值,等同于把它们删掉。

1
var1 = nil

2、Boolean类型

布尔值。在Lua中,只有falsenil才计算为false,其它任何数据都计算为true0和空串也是true

1
var2 = true

3、Number类型

数值型,在Lua里,数值相当于C语言的double,且没有整数类型。

一般情况下,只要数值不是很大(比如不超过100,000,000,000,000),是不会产生舍入误差的。

1
var3, var4 = 10, 3.14

5、String类型

字符串。字符串在Lua中有几种方法来表示,可以用双引号或单引号来括起一个字符串,如:

1
2
'This is a string.'
"This is Lua!"

如果要保持原来的空白和换行,则需要用两个方括号括起来:

1
2
3
4
5
6
7
javacode = [[
public class Test{
public static void main(Str Args[]){
System.out.println("Hello world!");
}
}
]]

使用 # 来计算字符串的长度,放在字符串前面,如下实例:

1
2
3
4
5
len = "www.runoob.com"
print(#len)
> 14
print(#"www.runoob.com")
> 14

也可使用string.len()utf8.len()函数获取字符串的长度,返回值为Number类型的数字。前者只用于计算包含ASCII字符串的长度,后者可以计算包含中文的字符串。如:

1
2
3
local myStr01 = "昨夜闲潭梦落fa"
print(utf8.len(myStr01))
> 14

类型转换:

Lua会根据上下文在合理合法的情况下隐式进行数字和字符之间的转换。

另外,也可以使用tonumber()函数和tostring()函数手动控制字符与数字的转换:

1
2
3
4
5
6
7
8
9
a = 666 b = '23163'
print(a + 100)
> 766
print(a + b)
> 23829
print(tonumber("bbc"))
> 报错!tonumber()的参数的每个字符必须都是数字!
print(a + tonumber('23163'))
> 23829

6、Table类型

后面详细说。

table是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。

Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是nil

Lua table 是不固定大小的,你可以根据自己需要进行扩容。

Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用format来索引table string

7、Function类型

函数类型,函数也是一种类型,也就是说,所有的函数,它本身就是一个变量。

在Lua中,函数是被看作是”第一类值(First-Class Value)”,函数可以存在变量里。

8、Userdata类型

userdata是一种用户自定义数据,用于表示一种由应用程序或C/C++语言库所创建的类型,可以将任意C/C++的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。

9、Thread类型

线程类型,在Lua中没有真正的线程。Lua中可以将一个函数分成几部分运行。

在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。

线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。

四、函数

1、函数的定义

上文提到,Lua中函数也是一种变量,所以定义函数要用关键字function

1
2
3
4
function suma_b()
...
return ...
end

2、可变参数

Lua函数可以接受可变数目的参数,和C语言类似,在函数参数列表中使用三点...表示函数有可变的参数。

1
2
3
function func01(...)
...
end

评论