Lua基础

🤔


Lua IDE

Mac端Lua IDE推荐使用Intellij+EmmyLua。这也是我使用过最好的Lua IDE
下载地址:IntelliJ IDEA
EmmyLua安装方法:Preferences ——>Plugins ——>搜索EmmyLua

在使用EmmyLua时出现bug,或对此插件有什么建议,可以加群:29860775进行反馈


Lua 数据类型

Lua是一种动态类型的语言。在语言中没有类型定义的语法,每个值都携带了它自身的类型信息。
在Lua中有8种基础类型,分别是nil、boolean、number、string、userdata、function、thread和table

名称 数据类型 描述 示例
nil 空类型 表示一个无效值 a
boolean 布尔 包含两个值:false和true a = true
number 数字 双精度类型的实浮点数 a = 7
string 字符串 由一对双引号或单引号来表示 a = ‘yu’
userdata 自定义类型 任意存储在变量中的C数据结构 标准i/o库
function 函数 由 C 或 Lua 编写的函数 见下文
thread 协程 表示执行的独立线路,用于执行协同程序
table Lua 中的表其实是一个”关联数组” a = {}

字符串

  • Lua中的字符串通常表示“一个字符序列”。
  • Lua完全采用8位编码,Lua字符串中的字符可以具有任何数值编码,包括数值0。 也就是说,可以将任意二进制数据存储到一个字符串中。
  • Lua的字符串是不可变的值。
  • Lua的字符串和其他Lua对象一样,都是自动内存管理机制所管理的对象
  • Lua字符串可以用以下方式来表示:
    s = 'Hello, World'
    s = "Hello, World"
  • Lua 提供了很多的方法来支持字符串的操作,可以查阅Lua 字符串来了解更多

变量

  • Lua 变量有两种类型:全局变量、局部变量。
  • Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声 明为局部变量。
  • 局部变量的作用域为从声明位置开始到所在语句块结束。
  • 变量的默认值均为 nil。
    local i = 1 --局部变量

Lua 流程控制

  • lua提供了一组传统的流程控制,if-else
  • if语句先测试条件,然后根据结果执行then部分或else部分,其中else部分是可选的:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    a = 0
    if a > 0 then
    print('a > 0')
    elseif a < 0 then
    print('a< 0')
    else
    print('a = 0')

    end

Lua 循环

  • Lua 语言提供了以下几种循环:
  1. while
  2. for
  3. repeat…until
  • 同时Lua 支持 break语句

while

  • 与其他语言一样,Lua中的while循环先测试条件,如果条件为真,就执行循环体,否则结束循环:
    1
    2
    3
    4
    5
    a = 0
    while a < 10 do
    print(a)
    a = a + 1
    end

repeat

  • Lua中repeat-until语句会重复执行循环体至条件为真时结束:
    1
    2
    3
    4
    5
    a = 0
    repeat
    print(a)
    a = a + 1
    until a > 10

for

  • Lua的for循环有两种形式:
  1. 数字型for
  2. 泛型for

数字型:

1
2
3
for i = 1, 10, 2 do
print(i)
end

含义为,i从1变化到10,每次变化以2作为步长递增并执行循环体。 其中步长是可选的,若不指定,则步长默认为1

泛型:

1
2
3
4
days = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
for i,v in ipairs(days) do
print(i, v)
end

泛型for循环通过一个迭代器函数来遍历所有的值,在Lua中,提供了ipairs这个用于便利数组的迭代器函数。每次循环,i会被赋予一个索引值,v会被赋予一个对应该索引值的数组元素值。
泛型for循环的功能非常强大,可以通过不同的迭代器来遍历所有东西。如:
迭代文件中的每行(io.lines)、迭代table元素(pairs)、迭代数组元素(ipairs)、迭代字符串中的字符(string.gmatch)等。当然,还可以自己编写迭代器。

break

  • break语句用于结束一个循环,它只会跳出包含它的内部循环,而不会改变外部循环。
    例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    a = 0
    while a < 10 do
    a = a + 1
    if a > 5 then
    break
    end

    print(a)
    end

function

  • 在Lua中,函数作为“一等对象”。这表示函数可以存储在变量中,可以通过参数传递给其他函数,还可以作为其他函数的返回值。这种特性使语言具有极大的灵活性。
  • Lua对函数式编程也提供了良好的支持。
  • Lua既可以调用自身的Lua编写的函数,也可以调用c编写的函数。
  • 函数的定义如下:
    1
    2
    3
    4
    5
    function SumTowNum(num1 , num2)
    return num1 + num2
    end

    print(SumTowNum(10, 11))

输出:
21

  • Lua函数可以返回多个结果值,比如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function maximum (a)
    local mi = 1 -- 最大值索引
    local m = a[mi] -- 最大值
    for i,val in ipairs(a) do
    if val > m then
    mi = i
    m = val
    end
    end
    return m, mi
    end

    print(maximum({8,10,23,12,5}))

输出:
23 3

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

table表

  • Lua table 实现了关联数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
  • Lua table 是不固定大小的,你可以根据自己需要进行扩容。

    table是Lua中主要的(事实上也是仅有的)数据结构机制,具有强大的功能,基于table,可以以一种简单、统一和高效的方式来表示普通数组、符号表、集合、记录、队列及其他数据结构。同时Lua也是通过table来表示模块、包和对象的

  • 可以将table想象成一种动态分配的对象,程序仅持有一个对它的引用(或指针)。

  • table的创建是通过构造表达式完成的:

    1
    2
    3
    4
    --创建table
    a = {}
    b = 'x'
    a.b = 10 -- key = 'x'. value = 10
  • tabel永远是匿名的,一个持有table的变量和table自身之间没有固定的关联性。


宇 wechat
扫描二维码,订阅微信公众号