Lua的学习

这篇博客详细介绍了Lua编程语言的基础知识,包括全局变量与局部变量、数据类型如Nil、Boolean、String和Function、表达式中的算术与关系运算、逻辑运算以及表table的使用。此外,还讲解了基本语法、函数的定义和调用以及闭包概念,最后提到了Lua中的表作为核心数据结构的特性和使用方法。

Lua的基本语法

第一章 起点

1.1、全局变量:Lua中默认的变量为全局变量,只有加上 local 才是局部变量,全部变量不赋值,直接访问得到的结果是 nil,同时把一个变量直接赋值为 nil 就是把这个变量给删除

1.2、词法约定:字母数字下划线组成,字母开头。
Lua 大小写敏感。
单行注释: –
多行注释: –[[ –]]

1.3、Lua的关键字:if then elseif end while for in do false true nil and not or repeat until local function return break

    Lua中只有 falsenil 为假 ,其余的都为真。
     0在 Lua 中为真值,Lua 的table 列表索引值是从 1 开始的,而不是从 0 开始的。
     Lua中的变量不需要类型的声明,没有赋值之前变量的类型都是未定的。

第二章 类型和值

Lua中的数据类型:nil boolean number string userdata function thread table
变量没有预定义的类型,每个变量都可以包含任何一种类型的值。

2.1、Nil:
nil Lua中的特殊类型,一个全局变量没有赋值之前都是 nil ,给一个全局变量赋值 nil 可以删除该变量。

2.2、Booleans:
两个取值 false 和 true。但是 Lua 中只有 false 和 nil 为假值,其余的值都是真。包括 0 和 空字符串。

2.3、string:
“” ”括起来的都是字符串,
[[
]]括起来的字符串可以包含多行

    string可以和number进行转化 
        print("10" + 2)       --> 12
        print("22" * 2)       --> 44 
        print("number" + 2)   --> error
    .. 在Lua中是字符串连接符,当在一个数字的后面写 .. 时,必须加上空格以防止被解释错误。
        print(10 .. 20)  --> 1020
        print(10..20)    -->error
    tonumber()函数是将字符串转化为数字,tostring()函数是将数字转化为字符串。

2.4、Functions:
函数可以存储在变量中,也可以作为函数的参数,可以作为返回值。在Lua中函数就是一个类型。

第三章 表达式

3.1、算术运算符:
二元运算符:+ - * / ^ (加减乘除幂)
一元运算符:- (负值)

3.2、关系运算符:

= < <= == ~= (在Lua中 ~= 是不等于)
这些操作符返回是 false 和 true
== 和 ~= 比较的类型如果不一致 Lua就认为是 false
nil 只能和自己比较
table userdata function 在Lua中是通过引用比较的,也就是当且仅当两者表示同一对象时才是相等的。

3.3、逻辑运算:

                and or not
            a and b  --若果 a 为 false,则返回 a ,否则,返回 b  相当于 C 语言的 &
            a or b   --如果 a 为 true ,则返回 a ,否则,返回 b  相当于 C 语言的 |

            C 语言中的三元运算符
            a ? b : c
            在Lua中的实现
            (a and b) or c

            not 的结果一直返回 false 或者 true

3.4、链接运算符:
.. – 两个点
如果操作数是数字,第一个数字后必须有空格,而且被转化成字符串

                print("Hello" .. " world") --> Hello world
                print(0 .. 1)              --> 01

3.5、表table:
初始化方法:
1、a = {} –空表
2、a = {1,3,4;”abc”;x=19} –直接初始化 用;表示不同类型的元素
3、a = {} –先创建一个空表
a.x = 1; a.y = 2
相当于:a = {x = 1,y = 2,} –尾部可以加 , 方便以后的扩展

        Lua中可以随意添加或删除元素,删除元素只需要把该元素赋值 nil

第四章 基本语法

4.1、赋值语句:
a = 1

         Lua中可以对多个变量同时赋值:a , b = 1 , 2  <==> a = 1 ; b = 2

         多个变量进行赋值时:
         a. 变量的个数 > 值的个数时: 多余的变量直接赋值为 nil
         b. 变量的个数 < 值的个数时: 多余的值直接被忽略
            a , b , c = 0, 1
            print(a,b,c)        --> 0 1 nil

            a,b = a+1,b+1,b+2  
            print(a,b)          -->1 2

            a,b,c = 0
            print(a,b,c)        --> 0 nil nil 

4.2、局部变量 local:
Lua中的变量默认是全局变量,只有加上 local 才是局部变量

        do end 相当于 C/C++中{}
        应尽量使用局部变量的好处:
                                a.避免命名冲突
                                b.局部变量的访问速度比全局变量要快很多
            do
                local a = 1
                print(a)        --1
            end
            print(a)            --nil

4.3、控制结构语句
if 语句,三种:

                            1.  if conditions then
                                    --body
                                end

                            2.  if conditions then
                                    --body
                                else
                                    --body
                                end

                            3.  if conditions then
                                    --body
                                elseif conditions then
                                    --body
                                    --可以有多个elseif
                                else 
                                    --body
                                end
            while 语句:
                            while conditions do
                                --body
                            end
            repeat-until 语句:
                            repeat
                                --body
                            until conditions
            for 语句有两大类:

                        a.数值 for 循环
                            for var = exp1,exp2,exp3 do
                                --body
                            end
                        其中exp3作为step 从exp1(初始值)到exp2(终止值),执行 --body
                        exp3可以省略 默认step 是 1

                        需要注意的地方:
                        1.三个表达式只会被计算一次,并且在循环开始前
                        2.其中变量var是局部变量,在只在循环内有效
                        3.循环过程中不要改变控制变量的值

                        b.范型 for 循环
                            for i,v in ipairs(a) do
                                print(i,v)
                            end

                            for k in pairs(t) do
                                print(t[k])
                            end
                        ipairs 和 pairs 的区别:
                                                ipairs 是按照 key 索引值递增的顺序访问 table 中的键-值队的
                                                pairs  是访问所有的键-值队的

                        例子:
                        a = {1,2,3,x=5,5}

                        for i,v in pairs(a) do
                            print(i,v)             
                        end
                        --> 把顺序打乱了,先按照索引值递增的顺序输出
                        1 1
                        2 2
                        3 3
                        4 5
                        x 5
                            for i,v in ipairs(a) do
                                print(i,v)
                            end
                        --> 只按照索引值输出
                        1 1
                        2 2
                        3 4
                        4 5

4.4、break 和 return 语句:
break 语句用来退出当前循环
return 语句用来从函数返回结果

第五章 函数

语法:

    function function_name( arguments-list )
        -- body
    end

    function_name = function( arguments-list )
        -- body
    end

函数调用时需要注意的:
1.如果参数列表为空,必须加上 ()
2.如果是单个参数,且这个参数是字符串或表构造时, () 是可选的
3.Lua函数实参和形参的匹配和赋值语句类似,多余忽略,缺少补上 nil

            1.Lua中的函数可以返回多个结果值
            2.Lua中的函数跟 C 语言一样可以是可变参数
            3.Lua中的函数跟 C++ 一样可以命名参数

Lua中的函数词法定界的第一类值。
第一类值:Lua 中的函数像其他值一样可以放在变量中,表中,函数的参数,函数的返回值
词法定界:Lua 中的被嵌套的函数可以访问他外部函数的变量。

函数闭包:

        function newCounter()     --定义一个函数闭包
            local i = 0           --局部变量 i
            return function ()    --匿名函数
                i = i + 1
                return i
            end
        end
        c1 = newCounter()         --创建一个闭包
        c2 = newCounter()         --创建一个闭包

        print(c1())               -- 1
        print(c2())               -- 1
        print(c1())               -- 2

第六章 表

lua中的数据结构只有一个:表table
原理:键值对 key-value

6.1 table 表示一个数组
数组的下标为正整数,且索引值是从 1 开始的。
(1) 数组的定义:
t = {值1 , 值2 ,值3 ,… , 值n}
(2)获取数组元素的个数:#t
例子:
t = {1,2,3,4,5,6}

6.2 table表
例子:
t = {x = 1 ,y = 2 ,z = 3}

完全的键值对,也可以是键值对和数组的混合

6.3 table表的使用
t[1],t[2] 这种按照下标来取值的
t.x t.y 这种按照键来取值的
t[“x”] t[“y”] 这种也可以的

注意:t[“x”] 是无效的

最有Lua中导入文件:
搜索目录加载文件,并判断文件是否已经加载,避免重复加载统一文件。

require”hello”
require(“hello”)

<think> 我们被要求提供Lua语言的学习资源和方法,并参考给定的引用内容。根据引用[1],Lua官方文档是最权威的资源,还有在线教程和书籍推荐。引用[2]和[3]提供了Lua语法的一些特点,如多重赋值和与C/C++的相似性。引用[4]对比了Lua和C#在分支、循环和函数结构上的差异。引用[5]提到了Linux下安装Lua的方法。 因此,我们可以将回答结构化为: 1. 学习资源:包括官方文档、在线教程、书籍。 2. 学习方法建议:结合Lua的特点(如语法简洁,与C/C++相似,但也有一些独特之处)给出学习建议。 3. 安装方法:简要提及(因为引用[5]提到了离线安装,但用户没有明确要求安装,所以可以简单提一下,或者根据需求决定是否详细说明)。 同时,按照用户要求,我们需要生成相关问题。 注意:引用内容已经用[^1]到[^5]标记,我们在回答中如果需要引用这些内容,应该在引用处添加对应的标识。 但是,用户问题中并没有直接提到安装,而是学习资料和方法,所以重点放在学习资源和方法上。 回答结构: - 开头介绍Lua语言(简要) - 学习资源(详细列出) - 学习方法(建议) - 安装方法(简要) - 生成相关问题 注意:用户要求使用中文,行内数学表达式用$...$(但Lua学习资料中可能较少涉及数学表达式,如果有变量名等,可以按照要求),独立公式单独成段(这里可能用不到)。 另外,用户要求生成相关问题,放在最后。 </think> ### Lua语言学习资料与方法 #### 一、权威学习资源 1. **官方文档** Lua官方文档是最权威的参考资料,涵盖所有语言特性和标准库用法,适合系统学习[^1]。 - 官网:[lua.org](https://www.lua.org/docs.html) 2. **在线教程** - **Tutorialspoint Lua教程**:结构化教学,适合新手[^1]。 - **Learn Lua in Y Minutes**:快速语法速查,适合有编程基础者[^1]。 3. **书籍推荐** - **《Programming in Lua》**:官方指定书籍,深入解析语言设计(推荐第四版,覆盖Lua 5.3+)[^1]。 - **《Lua 5.3 Reference Manual》**:详述语言机制,适合进阶开发者[^1]。 #### 二、高效学习方法 1. **语法入门要点** - **变量与赋值**:支持多重赋值(如 `local a, b = 1, 2`),注意多余值舍弃或补`nil`的规则[^2]。 - **分支与循环**: - 分支结构:`if...then...end`(无`{}`,用`end`闭合)[^4]。 - 循环结构:`for`循环使用`初值, 终值, 步长`格式,`repeat...until`替代`do...while`[^4]。 - **函数**:无显式返回值声明,依赖`return`;函数可作参数传递(无委托概念)[^4]。 2. **实践建议** - **类比C/C++**:若熟悉C/C++,可快速上手基础语法(如条件语句、函数调用相似)[^3]。 - **避开常见坑**: - 函数需先声明后调用(解释性语言特性)[^4]。 - 循环中仅支持`break`(无`continue`)[^4]。 - **动手项目**:从写小工具(如配置文件解析)到嵌入其他语言(如C#/Python)。 3. **环境搭建** - **Linux安装**:下载源码包解压(如 `tar -zxf lua-5.3.5.tar.gz`),需解决依赖(如`libevent-devel`)[^5]。 - **跨平台工具**: - LuaRocks(包管理器):快速安装库。 - ZeroBrane Studio(轻量IDE):调试支持。 #### 三、学习路径建议 1. **新手阶段**: `官方文档基础篇 → Tutorialspoint教程 → 《Programming in Lua》前8章` 2. **进阶阶段**: `《Lua 5.3 Reference Manual》 → 嵌入C/C++实战 → 开源项目源码阅读(如Redis的Lua脚本)` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值