• lua --- 基本语法学习


    0、安装

    0.1 安装

    mac:

    brew install lua
    
    • 1

     

    0.2 测试运行

    vi test.lua
    
    • 1
    print("Hello World!")
    
    • 1
    lua test.lua
    
    • 1

    在这里插入图片描述

    或者指定解释器执行

    #!/usr/local/bin/lua
    
    print("Hello World!")
    
    • 1
    • 2
    • 3

    在这里插入图片描述

     
     

    1、变量

    1.1 变量类型

      Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table

    a=10
    a=2.5
    a="abcd"
    
    • 1
    • 2
    • 3

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

     

    1.2 变量名

    字母、数字、下划线(不能以数字开头)

     

    1.3 作用域

    局部变量:local标识

    function num()
    	local i = 1
    	j = 2
    	print(i)
    	print(j)
    end
    num()
    print(i)
    print(j)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出结果

    1
    2
    nil
    2
    
    • 1
    • 2
    • 3
    • 4

     

    1.4 数据类型转化

    tostring()

    tonumber()

    a=100
    b=tostring(a)
    print(a,' ',b)
    print(type(a),' ',type(b))
    
    c='200'
    d=tonumber(c)
    print(c,' ',d)
    print(type(c),' ',type(d))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

     

    1.5 删除全局变量

    赋值为nil

    a=10
    a=nil
    
    • 1
    • 2
    -- nil 作比较时应该加上双引号
    type(X)=="nil"
    
    • 1
    • 2

    在这里插入图片描述
     

    2、运算符

    2.1 算数运算符

    + - * / % ^
    
    • 1

     

    2.2 关系运算符

    == ~= > < >= <=
    
    • 1

     

    2.3 逻辑运算符

    and or not
    
    • 1

     

    2.4 连接运算符

    ..

    a=1
    b=2
    c=a..b
    print(c)
    
    • 1
    • 2
    • 3
    • 4

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YIMg2Y1R-1659858151210)(lua.assets/image-20220729165632123.png)]

     

    2.5 一元运算符

    获取字符串长度#

    print(#'hello world')
    
    • 1

     

    3、字符串

    3.1 声明

    a='hello'
    b="hello"
    c=[['hello']]
    d=[["hello"]]
    print(a)
    print(b)
    print(c)
    print(d)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

     

    3.2 常用方法

    -- 转大写
    a='hello'
    print(string.upper(a))
    
    -- 转小写
    b='HELLO'
    print(string.lower(b))
    
    -- 替换
    -- 参数  要被替换的字符串,指定替换前的字符,指定替换后的字符,指定替换次数,如果不指定替换次数则全部替换
    local c=string.gsub("hello","l","hh",1)
    print(c)
    
    -- 查找位置 查找第一个出现在指定字符串中字符的位置,找不到的话就返回nil
    -- 参数  目标字符串,目标字符,开始位置
    local d=string.find("hello","l",5)
    print(d)
    
    -- 反转
    local e=string.reverse('hello world')
    print(e)
    
    -- 字符串长度
    local f=string.len("hello world")
    print(f)
    
    -- 字符串拷贝
    local g=string.rep("hello",2)
    print(g)
    
    -- 字符串截取
    local h=string.sub("hello",2,3)
    print(h)
    
    -- 字符串格式化
    local i=string.format("the value is:%d",i)
    print(i)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

     

    4、流程控制

    4.1 if

    -- if
    a=200
    if (a>1000)
    then
      print('more than 1000')
    else
      print('less than 1000')
    end
      
    -- if-else
    a=200
    if (a>1000)
    then
      print('more than 1000')
    elseif (a>1500)
    then
      print('more than 1500')
    else
      print('that')
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

     

    4.2 for循坏

    -- 从10开始,每次-2,直到值等于4
    for a=10,4,-2 do
      print(a)
    end
    
    -- 从1开始,每次+2,直到值等于10
    for a=1,10,2 do
      print(a)
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

     

    4.3 while循坏

    a=1
    while (a<10)
    do
      a=a+1
      print(a)
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

     

    4.4 repeat…until

    a=1
    repeat
      a=a+1
      print(a)
    until(a>5)
    
    • 1
    • 2
    • 3
    • 4
    • 5

     

    4.5 break

    a=1
    while(a<10)
    do
      print(a)
      a=a+1
      if(a>5)
      then
        break
      end
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

     

    4.6 goto

    Label格式::: Label ::

    local a = 1
    ::label:: print("--- goto label ---")
    
    a = a+1
    if a < 3 then
        goto label   -- a 小于 3 的时候跳转到标签 label
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    -- 利用goto实现continue
    for i=1, 3 do
        if i <= 2 then
            print(i, "yes continue")
            goto continue
        end
        print(i, " no continue")
        ::continue::
        print([[i'm end]])
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

     

    5、函数

    5.1 定义

    function 函数名(参数)
    	函数内容
    	return 返回值    --可以没有
    	end
    
    • 1
    • 2
    • 3
    • 4

     

    5.2 无参函数

    function hello()
      print('hello world')
    end
    
    hello()
    
    • 1
    • 2
    • 3
    • 4
    • 5

     

    5.3 有参函数

    function hello(a,b)
      print(a+b)
    end
    
    hello(2,3)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    -- 可变参数
    function add(...)  
    local s = 0  
      for i, v in ipairs{...} do   -- {...} 表示一个由所有变长参数构成的数组  
        s = s + v  
      end  
      return s  
    end  
    print(add(3,4,5,6,7))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

     

    5.4 返回值

    -- 单个返回值
    function hello(a,b)
      return a+b
    end
    
    print(hello(2,3))
    
    -- 多个返回值
    function hello(a,b)
      return a+b,a*b
    end
    
    print(hello(2,3))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    在这里插入图片描述

     

    5.5 匿名函数

    function fun(num)
      print("num:",num)
      num=num+1
      return function(x)
        print("x:",x)
        print("x*num",x*num)
      end
    end
    fun(12)(10)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

     

    5.6 闭包函数

    闭包就是用内部函数调用外部函数的变量,一般会返回内部函数然后使用外部函数来调用

    function fun()
      local num=10
      function ff()
        num=num+1
        print(num)
      end
      return ff
    end
    fun()()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

     

    5.7 递归

    function ff(num)
      if(num==0 or num==1)
      then
        return 1
      else
        return ff(num-1)*num
      end
    end
    
    print(ff(5))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

     

    6、table

    【Lua 里表的默认初始索引一般以 1 开始】

    6.1 数组

    6.1.1 一维数组

    可以动态增长

    arr={}
    arr[1]=123
    arr[2]=342
    print(arr[1])
    
    • 1
    • 2
    • 3
    • 4

     

    6.1.2 多维数组
    arr={}
    for a=1,4 do
      arr[a]={}
      for b=1,4 do
        arr[a][b]=a+b
      end
    end
    
    for a=1,3 do
      for b=1,3 do
        print(a,":",b," ",arr[a][b])
      end
    end
    
    -- 组合写法
    arr={}
    local n1,n2=3,4
    for i=1,n1 do
      for j=1,n2 do
        arr[i*n1+n2]=10
      end
    end
    
    for a=1,n1 do
      for b=1,n2 do
        print(a,":",b," ",arr[a*n1+n2])
      end
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28


    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

     

    6.1.3 释放内存空间
    arr=nil
    
    • 1

     

    6.1.4 迭代器遍历
    a={12,56,24,76,237}
    for y in pairs(a)
    do
      print(a[y])
    end
    
    -- 带下标
    -- 迭代器遍历
    b={12,56,24,76,237}
    for x,y in pairs(b)
    do
      print(x,":",y)
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

     

    6.2 链表

    6.2.1 声明

    类似字典

    local a={key=123,value=234}
    print(a.value)
    
    • 1
    • 2

     

    6.2.2 遍历链表
    -- 迭代器遍历
    local a={key=123,value=234}
    for x,y in pairs(a)
    do
      print(x,":",y)
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

     

    6.3 常用方法

    6.3.1 concat

    将一个table在指定开始和结束位置处以指定分隔符来连接的操作(下标从1开始)

    arr1={"erw","dfsf","qwrqw","rqwr"}
    arr2=table.concat(arr1,"~",1,3)
    print(arr2)
    
    • 1
    • 2
    • 3

     

    6.3.2 insert
    arr1={"erw","dfsf","qwrqw","rqwr"}
    table.insert(arr1,3,"hello")
    
    for x,y in pairs(arr1)
    do
      print(x,":",y)
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

     

    6.3.3 remove
    arr1={"erw","dfsf","qwrqw","rqwr"}
    table.remove(arr1,3)
    
    for x,y in pairs(arr1)
    do
      print(x,":",y)
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

     

    6.3.4 sort
    arr1={2,37,23,83,54}
    table.sort(arr1)
    
    for x,y in pairs(arr1)
    do
      print(x,":",y)
    end
    
    -- 指定排序规则
    -- 如从大到小排列
    arr1={2,37,23,83,54}
    table.sort(arr1,function(a,b) return a>b end)
    for x,y in pairs(arr1)
    do
      print(x,":",y)
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

     

    7、模块和包

    7.1 模块调用

    -- 文件名为 module.lua
    -- 定义一个名为 module 的模块
    module = {}
     
    -- 定义一个常量
    module.constant = "这是一个常量"
     
    -- 定义一个函数
    function module.func1()
        io.write("这是一个公有函数!\n")
    end
     
    local function func2()
        print("这是一个私有函数!")
    end
     
    function module.func3()
        func2()
    end
     
    return module
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    调用module

    require("module")
    print(module.constant)
    module.func3()
    
    • 1
    • 2
    • 3

    7.2 模块的加载

      require 用于搜索 Lua 文件的路径是存放在全局变量 package.path 中,当 Lua 启动后,会以环境变量 LUA_PATH 的值来初始这个环境变量。如果没有找到该环境变量,则使用一个编译时定义的默认路径来初始化。
    可以自定义:文件路径以 ";" 号分隔,最后的 2 个 ";;" 表示新加的路径后面加上原来的默认路径。
      export LUA_PATH="~/lua/?.lua;;"
    
    • 1
    • 2
    • 3

    使用C包

    与Lua中写包不同,C包在使用以前必须首先加载并连接,在大多数系统中最容易的实现方式是通过动态连接库机制。

    Lua在一个叫loadlib的函数内提供了所有的动态连接的功能。这个函数有两个参数:库的绝对路径和初始化函数。

    local path = "/usr/local/lua/lib/libluasocket.so"
    -- 或者 path = "C:\\windows\\luasocket.dll",这是 Window 平台下
    
    local f = assert(loadlib(path, "luaopen_socket"))
    f()  -- 真正打开库
    
    • 1
    • 2
    • 3
    • 4
    • 5

     

    8、文件

    8.1 常用方法

    mode

    r 以只读方式打开文件,该文件必须存在。

    w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

    a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)

    r+ 以可读写方式打开文件,该文件必须存在。

    w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

    a+ 与a类似,但此文件可读可写

    b 二进制模式,如果文件是二进制文件,可以加上b

    + 表示对文件既可以读也可以写

     

    func

    io.write()

    io.flush()

    io.close()

    io.open(filename,mode)

     

    8.1.1 创建文件夹
    os.execute('mkdir luadirtest')
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-neoJN2kT-1659858444413)(lua.assets/image-20220727095641101.png)]

    f = assert(io.open('luanewfile.txt','w'))
    f:close()
    
    • 1
    • 2

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bXUJS7eX-1659858444414)(lua.assets/image-20220727100221871.png)]

     

    8.2 输出文件

    输出一行

    local file=io.open('luanewfile.txt','r')
    io.input(file)
    print(io.read())
    io.close()
    
    • 1
    • 2
    • 3
    • 4

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IcGXUoSb-1659858444415)(lua.assets/image-20220729141228480.png)]

    逐行输出(最后无空行)

    for i in io.lines('luanewfile.txt') do
      print(i)
    end
    
    --使用文件句柄
    local file=io.open('luanewfile.txt','r')
    for i in file:lines() do
      print(i)
    end
    file:close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    输出整个文件(最后有空行)

    local file=io.open('luanewfile.txt','r')
    io.input(file)
    print(io.read('*a'))
    io.close()
    
    --使用文件句柄
    local file=io.open('luanewfile.txt','r')
    print(file:read('*a'))
    file:close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    --'*a' 读取整个文件
    --'*l' 读取下一行(不包括换行符)=io.read()
    --'*L' 读取下一行(包括换行符)
    --'*n' 读取一个数字(非数字开头返回nil,数字开头直到读到非数字)
    --num  读取num个字符
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    在这里插入图片描述

     

    8.3 写入文件

    local file=io.open('luanewfile.txt','w')
    io.output(file)
    io.write('hello world')
    io.close()
    
    --文件句柄
    local file=io.open('luanewfile.txt','w')
    file:write("hey go")
    file:close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述
    在这里插入图片描述

     

    8.4 文件指针

    “set”: 基点为 0 (文件开头)

    “cur”: 基点为当前位置,默认

    “end”: 基点为文件尾

    -- 从文件开头算起,跳过3个字符,然后输出2个字符
    local file=io.open('luanewfile.txt','r')
    file:seek('set',3)
    print(file:read(2))
    file:close()
    
    -- 从文件结尾算起,往前推5个字符,然后输出2个字符
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    在这里插入图片描述
     
     

    参考链接:
    https://www.runoob.com/lua/lua-tutorial.html
    https://www.sohu.com/a/468031584_120372431
    https://www.sohu.com/a/464455971_120372431
    https://www.sohu.com/a/466566945_120372431

     
    如有不对,烦请指出,感谢~

  • 相关阅读:
    RK3399驱动开发 | 13 - AP6356 SDIO WiFi 调试(基于linux4.4.194内核)
    基于springboot的房产销售系统
    功能测试
    深度学习自学笔记十四:图像分割的简单网络介绍
    关于 mysql 中没有string_agg函数问题
    STM32用超声波测距模块实现测距
    [附源码]Python计算机毕业设计SSM流浪猫狗救助站(程序+LW)
    语法练习:sleep_in
    智能垃圾桶(五)——点亮OLED
    Mysql慢sql优化
  • 原文地址:https://blog.csdn.net/my_miuye/article/details/126211279