云计算百科
云计算领域专业知识百科平台

【Lua】Lua 入门知识点总结

Lua 入门学习笔记

文章目录

  • Lua 入门学习笔记
      • 一、编译环境
      • 二、变量声明与作用域
      • 三、数据类型系统
        • nil 类型
        • number 类型
        • string 类型
      • 四、函数定义与使用
        • 函数声明
        • 参数与返回值
      • 五、表(table)数据结构
        • 数组型 table
        • 哈希表型 table
        • 全局表 _G
      • 六、控制结构
        • 逻辑运算
        • 分支判断
        • 循环结构
      • 七、字符串高级特性
      • 八、类型转换与数值表示
      • 九、编程实践要点

本教程旨在帮助有编程基础的学习者快速入门Lua编程语言。包括Lua中变量的声明与使用,包括全局变量和局部变量的区别,以及nil类型的概念、数值型、字符串和函数的基本操作,包括16进制表示、科学计数法、字符串连接、函数声明与调用等。此外,还介绍了table类型及其数字下标和字符串下标的用法,包括数组型table的声明、赋值、长度获取以及元素操作等。最后,介绍了Lua中的全局表、真和假的定义、分支判断语句以及三种循环语句(for循环、while循环)

建议有编程基础的同学使用这篇文章

一、编译环境

在线体验LuatOS

先直接写一个输出

print("hello world")

  • 是print不是printf
  • 语句后面没有分号

二、变量声明与作用域

  • 默认全局变量:Lua 中直接赋值的变量默认是全局变量,跨文件可见。

  • 局部变量:使用 local 关键字声明,作用域限定在当前代码块、函数或文件内。

  • 多变量赋值:

    local a = 0
    b, c = 1, 2 — 同时声明 b=1, c=2
    d, e, f = 1, 2 — c 未被赋值,值为 nil

    • 规则:
      • 左侧变量数 > 右侧值时,多余变量赋 nil;
      • 右侧值数 > 左侧变量时,多余值被忽略。

三、数据类型系统

nil 类型
  • 表示未初始化或显式赋空值:没有初始化的都为nil

  • 相当于C语言中的NULL类型

    local a
    print(undeclared_var) — 输出 nil

number 类型

在c语言里面数值有很多个类型,比如说int chair long float,但是在lua里面都统一叫做number数值型。

  • 统一数值类型,支持多种表示方式:

    • 十进制:123
    • 十六进制:0x1F(十进制 31)
    • 科学计数法:2e10(表示 20000000000)
  • 运算支持: lua也是支持加减乘除运算的,以及成幂符号,左移右移

    print(10 ^ 5) — 幂运算输出 100000
    print(1 << 3) — 左移运算输出 8
    print(8 >> 1) — 右移运算输出 4

string 类型

字符串的声明的话,跟c是差不多的。我们可以在lua里用双引号来圈住一些字,表示一个字符串也可以用单引号圈出一个字,表示字符串单引号和双引号都是可以的,而且支持转义字符。

  • 声明方式:

    • 单引号/双引号:支持转义符(如 \\n)

    • 长字符串:[[多行文本]](保留原始格式,不转义)

      a = "agcuiogogqWCU"
      b = 'uigdcfuwioge'
      c = [[dghoeuivfqwe
      qiowhc

      1266]]

  • 操作:

    另外在lua里面字符串的连接符号不是加号,是两个点

    c = a..b — 连接运算符是两个点
    print(#"0123456789") — 井号获取长度,输出 10

  • 类型转换:

    s = tostring(10) — 转字符串 "10"
    n = tonumber("10") — 转数值 10
    tonumber("abc") — 转换失败返回 nil

  • 显示字符串长度:

    a = "agcuiogogqWCU"
    print(#a) –在打印的前面加上'#'就可以显示这个字符串的长度

四、函数定义与使用

函数声明
  • 一般的声明方式:

    function function_name()
    — body
    end

  • 两种等效方式:

    function f(a, b) print(a, b) end
    f = function(a, b) print(a, b) end

参数与返回值
  • 参数处理:

    • 参数不足时自动补 nil,多余参数被忽略。
  • 多返回值: 我们可以在函数里主动返回一些值,并且可以返回多个值

    function f() return 1, 2 end
    i, j = f() — i=1, j=2

  • 默认返回值:无 return 时返回 nil。


五、表(table)数据结构

数组型 table
  • 语法:

    • 用大括号将成员括起来 ‘{ }’

    • 用赋值 ‘=’ 赋值给变量

    • 用逗号将成员分开 ‘,’

      arr = {1,2,3,4,5}

  • 核心特性:

    • 下标从 1 开始,支持混合类型元素(也就是说可以存数字、字符串、函数、其他的table,但要注意用 ‘,’ 隔开)。
    • 未定义元素值为 nil。
    • 动态扩展——对于table中没有定义的位置可以直接赋值
    • 自带的接口
      • insert(【table】,【位置】,【值】)
      • remove(【table】,【位置】) ——有返回值,返回被移除的元素
  • 操作示例:

    arr = {1, "two", {subtable = true}}
    print(arr[5]) — 输出 nil
    arr[5] = "new" — 动态扩展
    print(#arr) — 获取长度 5
    table.insert(arr, 2, "d") — 插入元素
    removed = table.remove(arr, 2) — 移除元素并返回 "d"

哈希表型 table
  • 字符串下标:

    tbl = {
    key1 = 1,
    c = function()
    –…..
    end,
    ["特殊符号"] = 123 –注意中括号以及""
    }
    tbl["abc"] = "abc"
    print(tbl.key1) — 输出 1(这种输出方式需要字符串下标符合变量命名规范)
    print(tbl["特殊符号"]) — 输出 123(注意是字符串,带有"")

  • 未声明键值返回 nil,支持动态添加键值对。

全局表 _G
  • 存储所有全局变量:

    a = 1
    print(_G["a"])
    print(_G.a) — 输出 1
    print(_G.table.insert) — 输出函数地址

  • 实际上table也是一个全局变量,table这个全局变量它的类型就是table,它有一个下标叫做insert,同时table, 它因为是全局变量,所以它也在下划线g全局表里面,就像这样,我们打印出来发现它是一个table,而且呢,因为他也是一个table.

print(_G["table"]["insert"])

六、控制结构

逻辑运算
  • 真假规则:仅 false 和 nil 为假,其他值(包括 0)为真。

    a = true
    b = false
    print(1 > 2)
    print(1 < 2)
    print(1 <= 2)
    print(1 >= 2)
    print(1 == 2)
    print(1 ~= 2)

    注意:在lua中不等于是用 " ~=" 表示的,不是用 “!=” 表示的

    短路求值:

    print(nil or 0) — 输出 0(返回第一个真值)
    print(true and "yes") — 输出 "yes"(返回第二个操作数)

  • and(与) or(或) 和 not(非)

    a = true
    b = false
    print(a and b)
    print(a or b)
    print(not a)

    注意:

    • 在lua里有个特殊的规定,在lua里面只有false和nil代表假,其他都是真c语言里面零也代表假,但是在lua里面数字0是代表真的,因为他不是nil或者false

    • Lua里面的end or和not返回的并不是完全是false和true, lua里会直接返回a或者b的值

    • 我们可以用and和or来实现短路求值

      a = nil
      b = 0
      print(a and b)
      print(a or b)
      print(not a)

      运行结果:

      在这里插入图片描述

分支判断
  • 语法:

    if 【condition】 then
    — code
    elseif 【condition2】 then
    — code
    else
    — code
    end

  • 注意:

    • elseif中间没有空格
    • 条件后面有then
    • 就像上面提到的0也是代表真
循环结构
  • for 循环:

    for i = 1, 10 do — 倒序循环
    if i == 5 then break end
    end

    注意:

    • 循环定义了一个变量,然后给变量一个初值,再给变量定义一个结束值,下面是执行的代码块,这个变量是可以直接使用的。当然这个变量出了这个代码块之后,就没有意义了。

    • 我们还可以再加一个参数,这个参数叫做步长,就是每一次循环初值i的变化的值

    • 循环里面i在运行图中是不能手动更改的。如果你修改了,他会默认悄悄给你在这边新建一个变量,它新建了一个临时变量,叫做i,你后面调用的时候会用到i,这一点和c不太一样,它的循环是不能更改的。

      for i = 10, 1, 1 do — 倒序循环
      if i == 5 then break end
      end
      for i=10,i,1 do
      print(i)
      local i=1 — 新建一个临时变量
      –….
      end

  • while 循环:

    n = 10
    while n > 1 do
    n = n 1 — 必须显式修改循环变量
    if n == 5 then break end
    end

    注意:lua不支持自减操作如n–、n -= 1这些

七、字符串高级特性

  • 二进制安全:支持存储空字符(0x00):

    s = string.char(0x30, 0x31, 0x32, 0x33, 0x00)
    print(#s) — 输出 5(包含空字符)

  • 索引从 1 开始:

    second = string.sub(s, 2, 2)
    print(string.byte(second)) — 输出 49(ASCII 码值)

八、类型转换与数值表示

操作成功返回值失败返回值
tonumber("123") 123 nil
tonumber("0x1F") 31 nil
tostring(123) “123”
tostring(nil) “nil”

九、编程实践要点

  • 变量作用域:优先使用 local 声明局部变量。
  • 表操作:注意数组下标从 1 开始,# 仅统计连续数字下标长度。
  • 字符串处理:使用 .. 连接,# 获取字节长度。
  • 函数设计:支持多返回值,参数不足自动补 nil。
  • 全局变量管理:通过 _G 表访问,避免污染全局命名空间。
  • 进一步学习建议:

    • 参考 Lua 5.3 官方手册
    • 搜索 “Lua 5.3 参考手册” 查看完整函数库(如数学库、协程等)。

    后面我会整理进阶部分的笔记,之后会把笔记链接粘贴到这里。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 【Lua】Lua 入门知识点总结
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!