Lua 编程学习笔记

这篇博客详细介绍了Lua编程的学习过程,包括环境安装、基本语法、循环与流程控制、函数、表与数组、模块与包、元表、协同程序、文件IO以及面向对象编程。还特别提到了在游戏开发中,如饥荒,如何应用Lua脚本,并学习了ECS框架。
摘要由CSDN通过智能技术生成

Lua 编程学习笔记

Lua编程语言给人的感觉是小巧,简洁,解释性语言,弱类型,主要用于游戏开发,嵌入式脚本开发。

此次学习源于写饥荒脚本,用饥荒学习Lua绝对是不错的一个实战。

一、环境安装

首先在官网下载

Lua下载是一个压缩文件,解压即可用,但是需要先编译一下。
LuaContent

默认是没有可执行程序的,需要使用命令制作一下。

在当前src目录下打开终端窗口,执行命令

make

make之后生成lualuac两个可执行程序
makeFile
这样我们就可以用Lua这个可执行程序执行我们编写的.lua文件了。

我使用的是IDE是Idea,Idea需要编写Lua需要下载一个插件:EmmyLua
EmmyLua
使用这个插件可以高亮显示还有方法提示,可以Tab键自动补全。

安装后运行Lua文件的需要配置文件的解释程序。
ideaConfig
这样整体的开发环境就搭配好了。


二、Lua 基本语法

1. 注释

单行注释

-- Lua 的单行注释使用 `--`
print("Hello Lua")

多行注释

--[[
    多行注释1
    多行注释2
    多行注释3
]]
print("Hello Lua")

2. 标识符

和其他编程语言一样,Lua的标识符由字母、数字以及下划线组成,且不能以数字开头,不能是关键字
比如:__index

3. 变量

Lua作为弱类型语言,变量的定义不需要声明数据类型。

-- 整数变量 a
a = 1

-- 字符串变量 a
a = "Test"

-- 布尔类型 a
a = false

变量的作用域默认是全局,只有声明为local的变量才是局部变量

弱类型语言的变量使用很随意,如果变量的数据类型使用错误,只有在运行时才能发现,体现的是规范大于约定的思想。

4. 数据类型

虽然变量的定义不需要声明数据类型,但是Lua大体上还是分为8种数据类型

  • nil
  • number
  • string
  • boolean
  • function
  • table
  • userdata
  • thread

nil代表空值,被赋值为nil的变量将清空,userdata和thread目前还没接触,其他类型只有nil和table的概念比较特殊。

注:Lua中的布尔值只有nil和false为条件表达式的否判断。

-- number类型也是真值
a = 1
if a then
    print("a是ture")
end 

-- 函数类型也是真值
function fn() 
    print("fn函数")
end
if fn then
    print("fn函数只要不为nil也是真值")
end 

5. Lua 运算符

1)算术运算符

  • + 加法
  • - 减法
  • * 乘法
  • / 除法(真实运算,不会取整数,Java里边10/3=3,这里10/3=3.3333333333333)
  • % 求余
  • ^ 幂运算( 2^3=8.0)
  • - 负号,对数字前面直接加取负数
  • // 整数运算,这个才是同Java的除法运算,10/3=3

2)逻辑运算符

  • and 逻辑与运算
  • or 逻辑或运算
  • not 逻辑非运算

3)关系运算符

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

注意Lua的不等于写法~= 这个还是挺新鲜的写法。

4)其他运算符

Lua 没有类似++, --的操作,循环时候一定要注意!

  • .. 拼接字符串,同Java的 + 拼接字符串
  • # 返回字符串或者表的长度
print(#"Hello")     -- 输出 5

tab = {
   1,2,3}
print(tab)          -- 输出3

三、循环与流程控制

Lua循环和其他语言类似,只是需要注意基本的格式。

1. 循环

三种循环方式

  • while
  • for
  • repeat … until
-- 方式一 while 循环
a = 0
while a < 10 do
    print("while循环"..a)
    a = a + 1
end

-- 方式二 for 循环
for i = 1, 10 do
    print("for循环"..i)
end

-- 方式三 repeat 循环
c = 0
repeat
    print("repeat循环"..c)
    c = c + 1
until c > 10

repeat … until 循环好比是Java中的 do…while循环,至少执行一次。

2. 流程控制

-- if 结构
if a>b then
    return a
end

-- if elseif else 结构
if a > 90 then
    print("优秀")
elseif a > 80 then
    print("良好")
elseif a > 60 then
    print("及格")
else
    print("不及格")
end

循环和流程控制都没有特殊的,需要注意的是基本格式,Lua里边无论函数还是循环控制,都是以end结尾

四、函数

Lua函数比较特殊,第一次遇到可以返回多个值。

1. 基本定义

-- 方式一
function f1()
    -- do something
end

-- 方式二
local f2 = function(arg1,arg2,arg3) 
    -- do something
    return arg1,arg2,arg3
end

Lua的函数修饰符只有local定义是否为局部函数,参数可选。主要是可以类似函数f2,可以返回多个数据。

接收函数返回值的时候也可以多个变量一一对应接收。

function f3()
    return 1,2,3
end

a,b,c = f3()
print(a,b,c)    -- 输出 1,2,3

2. 可变参数

函数接收可变参数有个内置变量arg这个需要主要,他是一个表table

-- `...` 代表可变参数
function f4(...)
    local arg = {
   ...}

    -- 遍历方式一
    for k, v in pairs(arg) do
        print(k,v)
    end

    -- 遍历方式二
    for k, v in ipairs{
   ...} do
        print(k,v)
    end

    print(#arg)                         -- 定义 local = {...} 可通过 #arg 获取参数个数
    print(select("#",...))       -- select("#",...) 获取可变参数个数
end

f4(1,2,3,4)                             -- 最后打印 4

-- 函数作为参数传递

function f5(func)
    local ret = func
    
end

注:可变参数的获取方式和数据获取方式是重点

另外,ipairs和pairs的主要区别是ipairs遇到nil则会停下来,而pairs遍历不会。

for k,v in pairs(table) do … end 这是一种基本固定的遍历表的写法,类似Java中的增强for循环。

3. 函数作为参数传递

函数作为参数传递给下个函数时,函数内可以调用这个函数做一些数据处理

function max(a,b)
    if a > b then
        return a
    else
        return b
    end
end

function printMax(a,b,maxFunc)
    print(maxFunc(a,b))
end

printMax(2,3,max)

五、表与数组

表是Lua中最常用的数据结构了,基本上数据的使用都是通过表,但我理解更像是一个Map容器,存储一些key,value的键值对。

1. 基本定义

-- 数组没有单独的表示方式,数组就是用表表示的,只不过没有key,默认key就是1,2,3...连续索引
-- 一对花括号就代表这是一个表,前面的数据类型有一个就是table表数据类型
tab = {
   }

-- 也可以初始化(数组)
fruits = {
   "apple","peach","banana"}

-- 这个更应该被认为是表,以指定的key-value形式存在
table_defin
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值