lua学习笔记

这篇博客主要介绍了Lua的基础知识,包括命令行模式下的运行、全局变量的创建与删除、8种基本数据类型、字符转义、类型转换、运算符以及表和函数的使用。特别强调了表的构造和函数调用的多种形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、命令行模式下lua的运行

执行lua,进入交互式命令行,ctrl+d  os.exit()退出命令行。
-l指定运行chunk的先后顺序,-l选项会调用require,将会在指定的目录文件下搜索。

调试或者测试lua代码:

-i要求lua运行指定chunk后进入交互模式(意思是接下来可以继续在交互模式下操作而-l运行一次后直接退出)
命令行中使用dofile函数连接外部的chunk,dofile函数加载文件并执行。(方便测试函数功能)

2、命令模式下创建和删除全局变量

给一个变量赋值为非nil,该变量即为一个全局变量。删除时赋值为nil.

3、lua的命令行方式

lua -e "cmd"
设置交互模式的提示符:lua -i -e "_PROMPT=' lua> '"
lua  [options]  [script  [args]]
lua  -e "sin=math.sin"  script  a  b
全局变量arg存放lua的命令行参数(结合用户栈的组织结构)
lua使用所有参数构造arg表,arg[0]存储脚本名  脚本参数从1开始存储,脚本前面的参数从-1开始存储
arg[-3]="lua"
arg[-2]="-e"
arg[-1]="sin=math.sin"
arg[0]="script"
arg[1]="a"
arg[2]="b"

lua通过配置来设置交互模式的环境,可以加载包,修改提示符和路径,定义自己的函数,修改或者重命名函数:
在运行参数之前lua会查找环境变量LUA_INIT的值,如果存在且为@filename,lua将加载指定文件,如果存在但不是以@开头,lua假定filename为lua代码并运行。

4、动态语言lua中的8个基本类型:

nil     为初始化的变量都是这个类型
boolean     true  false--[[false和nil为假,其余都为真,0和空串都是真--]]
number      --[[int  float  double  long都属于--]]
string      --[[char  char*都属于--]]
userdata
function    print()  type()--[[type()的返回类型为string  函数也可以赋值给变量,之后可以用该变量代替该函数--]]
thread
table

5、

 lua中字符串是不可以被修改的,可以使用string的相关方法获取到string的部分值保存在新的变量中。string对象由lua自动进行内存的释放和分配。

相关的字符转义

 \ddd方式可以表示字母    \最多可以将3个数字转义
   使用[[...]]表示字符串,用来包含一段代码很方便,这种形式的字符串可以包含多行,可以嵌套且不会解释转义序列。

6、lua中的隐式类型转换

 当一个字符串使用算术操作符时,string会转成数字(当然可以转换成功的仅限于数字字符串)
   当lua期望string但却碰到数字时,会将数字转成string  ..在lua中时字符串连接符,当在数字后面写..时,必须加上空格防止被解释错。

7、显示类型转换

 tonumber()显示将string转换为数字,string不是正确的数字时返回nil tostring()显示将数字转换为string

8、

 functions和其他变量相同,函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值

9、运算符

 lua通过引用比较tables  userdata 
 functions(当且仅当两者表示同一个对象时相等,即使两个对象的值相等但若是构造的两个对象则他们不等)

–[[重点–]]

10、表的构造

 - lua中的数组实际存储数据是从1小标开始的,0下标的数据是nil
 - 构造器是创建和初始化表的表达式,最简单的构造函数是{},用来创建一个空表。
 - 表的几种初始化方法:
 - 使用[expression]显示的表示将被初始化的索引 opnames = {["+"] = "add",
             ["-"] = "sub",
             ["*"] = "mul",
             ["/"] = "div",
           }
 - record初始化:

    a = {x=0, y=0}     <==>    a = {};  a.x=0;a.y=0

 - 混合列表和record初始化:

    polyline = {color="blue",thickness=2,npoints=4,
            {x=0,y=-5}          --polyline[1]
            {x=-10,y=0}
            {x=-8,y=3}
            {x=5,y=5}
            }

 - list初始化和record初始化的比较:

    {x=0,y=0}                       <==>    {["x"]=0,["y"]=0}
    {"red","green","blue"}  <==>    {[1]="red",[2]="green",[3]="blue"}

http://wiki.jikexueyuan.com/project/lua/tables.html       lua教程
一个表可以被不同的变量引用,一个变量也可以随时改变所引用的表对象。

10、基本语法

 - 多值赋值(变量列表和值列表):

    常用来交换变量,或者函数调用返回多个值给多个变量
    x, y = y, x
    a, b = f()
    当变量的个数和值的个数不一致时:若值个数不够则补nil  若变量的个数不够多余的值被忽略

 - 局部变量与代码块:

    local定义一个局部变量,该局部变量的生命周期在代码块内(控制结构、函数体、chunk)
do ... end  相当于c/c++中的{}
局部变量:避免命名冲突、访问局部变量的速度比全局变量快

 - for循环:

    数值for循环 
        for i=10,1,-1 do   --初始值,终止值,步进(默认为1)
            print(i)
        end
            初始值,终止值,步进 只在循环开始前计算一次
        控制变量自动被声明为局部变量,只在循环内有效
    范围型for循环
 /***************************************************/
与迭代器有关,注意使用pairs()和ipairs()函数
/***************************************************/

11、函数

  • lua中函数调用形式

    例外情况(当函数只有一个参数并且这个参数是字符串或者表构造的时候,()可有可无)
    
    print "hello world" <==> print("hello world")
    dofile 'a.lua'      print('a.lua')
    print [[a multi-line message]]      print([[a multi-line message]])
    f{x=10, y=20}       f({x=10, y=20})
    type{}          type({})
    lua也提供面向对象方式调用函数o:foo(x)    o.foo(o.x)
    
     - lua中函数实参与形参的匹配方式
    
    多余部分被忽略,缺少部分用nil补足。
    
     - lua函数中多值返回
    
        在return后列出返回值列表可以返回多个值
    
     - 发生函数调用的几种情况:
    
        函数调用作为表达式
        1、函数调用是表达式的最后一个参数(最右边的)或者表达式仅有一个参数时,根据变量的情况尽可能的返回多个值,不足补nil,超出舍去
        2、其他情况只返回第一个返回值
    
    函数调用作为函数参数时:
    与多值赋值相同
    
    函数调用在表构造函数中初始化时:
    与多值赋值相同
    可以使用圆括号强制使调用返回一个值
    
     - lua中特殊函数unpack
    
    该函数接受一个数组作为参数,返回数组中的所有元素
    unpack被用来实现泛型调用机制,例如调用可变参数的可变函数:
        f = string.find
        a = {"hello", "ll"}
        print(f(unpack(a)))
    
     - lua中的可变参数:
    
        lua将函数的参数放在arg表中,arg表中有一个域n表示参数个数。
        pr = ""
        function pf(...)
            for key,value in iparis(arg) do
                pr = pr .. tostring(value) .. "\t"
            end
        pr = pr .. "\n"
        print(pr)
        print(arg.n)
        end
    亚元(不用的变量起到占位的作用)  local  _, x = string.find(s,p)
    
  • 对arg表的应用

    function select(n, ...)
        return arg[n]
    end
    
    print(string.find("hello hello","hel"))
    print(select(1,string.find("hello hello","hel")))  --[[arg[1]--]]
    print(select(2,string.find("hello hello","hel")))  --[[arg[2]--]]
    
  • 命名参数(个人的理解是实现类似c++中默认参数的功能)

    setPosition(x=1, y=2)      --[[在lua中是不合语法的--]]
    function  setPosition(point)  then
        print(point.x, point.y)
    end
    setPosition({x=1, y=2})
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值