当前位置:   article > 正文

Lua 编程学习笔记_lua编程

lua编程

Lua 编程学习笔记

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

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

一、环境安装

首先在官网下载

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

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

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

make
  • 1

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

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

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


二、Lua 基本语法

1. 注释

单行注释

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

多行注释

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

2. 标识符

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

3. 变量

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

-- 整数变量 a
a = 1

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

-- 布尔类型 a
a = false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

变量的作用域默认是全局,只有声明为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 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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
  • 1
  • 2
  • 3
  • 4
  • 5

三、循环与流程控制

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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

四、函数

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

1. 基本定义

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

-- 方式二
local f2 = function(arg1,arg2,arg3) 
    -- do something
    return arg1,arg2,arg3
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

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

function f3()
    return 1,2,3
end

a,b,c = f3()
print(a,b,c)    -- 输出 1,2,3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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
  • 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

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

另外,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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

五、表与数组

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

1. 基本定义

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

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

-- 这个更应该被认为是表,以指定的key-value形式存在
table_define =
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/859121
推荐阅读
相关标签
  

闽ICP备14008679号