Lua使用指南

2023-11-11


 

简介

lua 是一种开源、轻量的脚本语言,其设计目的是嵌入应用程序中,为应用程序提供灵活的扩展功能。

lua 特性

  • 轻量级:解释器使用标准c语言编写,编译后仅仅一百余K,可以很方便的嵌入到应用程序中;
  • 提供了易于使用的扩展接口、机制,扩展性强;
  • 自动内存管理
  • 功能丰富,支持闭包、协程、文件IO、数据库访问;
  • 支持面向过程编程、面向对象编程、函数式编程。lua提供了通用类型的表(table),用它可以实现数组,哈希表,集合,对象以及实现面向对象编程。
     

Lua 应用场景

  • 游戏开发
  • 独立应用脚本
  • Web 应用脚本
  • 扩展和数据库插件,如:MySQL Proxy 和 MySQL WorkBench
  • 安全系统,如入侵检测系统

 

环境配置

安装lua解释器:需要下载源码包,自行解压、编译,步骤可参考:https://www.lua.org/download.html

win也可以直接下载、安装第三方提供的exe文件,包含了lua解释器、编辑器(IDE):https://github.com/rjpcomputing/luaforwindows/releases 只更新到了2018年。

 

基本语法

lua区分大小写

-- 单行注释

--[[
 多行注释
 多行注释
--]]


-- 可以 lua xxx.lua 执行lua脚本,也可以在lua脚本首行用 #! 指定解释器 ,然后 ./xxx.lua 执行脚本,会自动使用指定的解释器来执行文件
#!/usr/local/bin/lua


-- 输出,输出多个时英文逗号分隔
print("xxx")
print("xxx1", "xxx2")

 

变量

  • lua是动态类型语言,变量不需要声明类型,会自动根据值确定类型,未初始化的变量 值为 nil。
  • lua变量有三种类型:全局变量、局部变量、表中的域。默认为全局变量,语句块或是函数中默认也是全局变量,除非用 local 显式声明为局部变量。局部变量的作用域为从声明位置开始到所在语句块结束。
a = 5               -- 全局变量
function joke()
    c = 5           -- 全局变量
    local d = 6     -- 局部变量
end


-- nil
print(i)


-- 可以同时给多个变量赋值
a, b = 10, 20
-- 变量、值的数量要对应,否则后面的变量值为nil。eg. a=10,b=nil
a, b = 10

-- 交换2个变量的值
x, y = y, x 

 

运算符

与其它语言相比,lua中需要注意以下运算符

运算符 说明
// 整除(直接舍弃小数部分,只保留整数)
== 、~= 等于、不等于
and、or、not 逻辑运算符
字符串连接符,eg. "hello "…“world”
# 一元运算符,获取字符串或table的长度,eg. #“张三”

lua不支持自增 ++、自减运算符 –

 

数据类型

lua的8种基本数据类型

数据类型 描述
nil 空,表示一个无效值,可以把变量赋为 nil 来删除变量
boolean 包含两个值:true、false,lua 会把 false、nil 看作是 false,其它的都为 true,数值0也会作为 true
number 数值型,lua默认只有双精度浮点数这一种数值类型
string 单、双引、[[ ]]均可,[[ ]]类似于html的<pre>标签,用于标识一段字符串,不解析其中的特殊字符、原样展示
function 函数,通常用 C、Lua 编写,可以作为参数,可以有0个或多个返回值,有多个返回值时用英文逗号分隔
table 表,实质是一个关联数组,index可以是任意类型,不为nil即可。index为数值时可以作为数组,不同于其它语言 lua table 的 index 一般从1开始,index为其它类型时可以作为字典。table容量不固定,添加新数据时会自动扩容。
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线路,用于执行协同程序

 

字符串

常用方法可参考:https://www.runoob.com/lua/lua-strings.html

 

table 表

通过"构造表达式"来创建table

-- 创建一个空表
local table1 = {}
-- 创建时可以初始化数据
local table2 = {"apple", "pear", "orange", "grape"}


-- table的index可以是任意类型,index为数值型时可以作为数组(lua数组的index一般从1开始),index为其它类型时可以作为字典。可以通过 [key] 或 .key 访问table中对应的值
table1[1] = “chy”
table2["username"] = "chy"

-- table中不存在的key,对应的value是 nil
print(table2["xxx"])


for key, value in pairs(table2) do
    print(key .. ":" .. value )
end

table常用方法可参考:https://www.runoob.com/lua/lua-tables.html

 

函数

lua的代码块(函数、if语句、循环语句)都不使用 { } 标识代码块,但都需要以end结尾,标识代码块的结束

function sum(m, n)
	sum = m + n
    print("sum=", sum)
    return sum
end


-- 支持多个返回值,多个返回值时以英文逗号分隔
function hanle(m, n)
    return m, n
end


-- 支持可变数量的参数
function test(a, ...)
	print(a)
	print(...)
	--使用可变参数中的某个值
	local args = {...}
	print(args[1])
end


--函数可以作为参数
function handle(a, b, func)
    result = func(a, b)
	print(result)
end


--可以使用匿名函数
handle(1, 2,
	function(a, b)
		return a + b
    end
)

 

常用语句

if

a = 60;

if(a >= 60) then
    print("及格")
end


if(a >= 60) then
    print("及格")
else
   print("不及格" )
end


-- elseif 是连写的,中间没有空格
if( a >= 80 ) then
   print("优秀" )
elseif( a >= 60 ) then
   print("及格" )
else
   print("不及格" )
end

 

while 循环

a = 10
while( a < 20 ) do
   print("a的值为:",  a)
   a = a+1
end

 

repeat…until

相当于其它语言的 do…while

a = 10
repeat
   print("a的值为:",  a)
   a = a + 1
until( a > 15 )

 

for循环

lua中的for循环可分为2类

  • 数值for循环:指定3个参数,初始值、终止值、步长,初始值、终止值都包含,步长支持负数、可缺省,缺省时默认为1
  • 泛型for循环:通过一个迭代器函数来遍历所有值,类似于其它语言的 foreach
-- 数值for循环
for i=1,10,2 do
    print(i)
end

-- for循环的三个数值只在循环开始前一次性获取,循环过程中不再实时获取。比如下面的f(x)只会在循环开始前执行一次,循环过程中直接使用循环开始时获取的值
for i=1,f(x),2 do
    print(i)
end

-- 泛型for循环,ipairs(arr) 可获取数组的迭代器
days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}  
for index,ele in ipairs(days) do  
	print(index, ele)
end  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lua使用指南 的相关文章

  • 如何在表中表示 nil

    假设我想存储一个元素列表 包括一些零值 值的位置很重要 我需要表示列表中给定位置处不存在值 这里有一个问题 a 1 2 3 nil 4 for k v in ipairs a do print k v end print a 4 print
  • 在 lua 中使用相等运算符比较数字有多安全?

    在我的引擎中 我有一个用于脚本编写的 Lua VM 在脚本中 我写了这样的内容 stage stage 1 if stage 5 then end and objnum tonumber 5 if stage objnum 根据 Lua 来
  • Lua 和序列化闭包

    我正在尝试序列化和反序列化 Lua 闭包 我的基本理解是下面的工厂应该生成闭包 并且Lua在函数和闭包之间没有太多区别 即没有类型 闭包 gt function ffactory x return function return x end
  • 如何访问废弃的函数参数?

    在 Lua 中 调用带有多余参数的函数将简单地丢弃这些参数 有没有可能与debug库来访问这些被丢弃的参数 我不是在寻找可变参数函数 function test local info debug getinfo 1 u print info
  • 我应该用 C++ 封装 Lua 代码的哪些代码?

    我终于将 LuaBind 配置为与我的 C 项目一起使用 我最近发现 Tiled 地图编辑器可以选择将文件导出为 lua 所以我想尝试一下 我将使用什么代码来封装下面粘贴的代码以使其与我的 C RPG 项目一起使用 return versi
  • 如何解密Lua字节码?

    早上好 我正在尝试破译 Moon 字节码 但我无法以任何方式 有人可以帮助我吗 我有这个 例如 code 27 76 117 97 81 0 1 4 4 4 8 0 如何将此字节码解密为文本 我已经在这里搜索 http www asciit
  • 为什么 LuaJIT 和 Lua 中的数字舍入格式不同?

    Using string format 据说遵循 Csprintf 在 LuaJIT 轮次中格式化数字与我尝试过的所有其他 Lua 解释器不同 lua v Lua 5 4 1 Copyright C 1994 2020 Lua org PU
  • Redis 排序集和解决关系

    我正在使用 Redis 排序集来存储我正在处理的项目的排名 我们没有预料到 我们想要如何处理关系 Redis 按字典顺序对具有相同分数的条目进行排序 但我们想要做的是对具有相同分数的所有条目给予相同的排名 例如在以下情况 redis 127
  • 用于嵌入式服务器的 Web 技术

    我最近开始了一个针对嵌入式设备的新 Web 开发项目 并希望征求一些有关使用技术的建议 该设备将提供 HTML 页面 其中包括用于从 JSON 服务器检索数据的 AJAX 代码 我们暂时使用 Cherokee 作为 Web 服务器 但我们并
  • Redis INCRBY 有限制

    我想知道是否有一种方法可以通过我的应用程序的单次往返在 Redis 中执行此操作 对于给定的键K 其可能值V是范围内的任意整数 A B 基本上 它有上限和下限 When an INCRBY or DECRBY发出命令 例如INCRBY ke
  • Lua-迭代嵌套表

    我已经学习 Lua 几个星期了 这一次又一次成为我的症结所在 我尝试阅读有关该主题的帖子和书籍 我使用 Lua 查询软件监控系统 Nimsoft 我的数据以表格形式返回给我 我不会发布整个输出 但这里有一个我认为可以描述结构的片段 表参考是
  • 确定已编译Lua的编译器版本

    我有一些已编译的 LuaQ 我需要确定用于编译它的确切版本 有什么可能的方法吗 编译的脚本在文件开头有一个标头 4 bytes signature x1bLua 1 byte version 0x51 1 byte format 1 byt
  • 在lua中组合两个函数

    我刚开始学习lua 所以我的要求可能是不可能的 现在 我有一个接受函数的方法 function adjust focused window fn local win window focusedwindow local winframe w
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • 检查多个位置的值并仅在源唯一时返回匹配项

    假设我有一个清单Vendors 阿斯达 乐购 Spar 我有一个清单Sources 或者这个类比中的供应商 家乐氏 Kellogg 吉百利 Cadbury 雀巢 Nestle 强生 Johnsons 帮宝适 Pampers Simple 等
  • Lua 将字符串转换为数字 - 取决于语言环境

    刚刚注意到字符串 and tonumber 在 Lua 中是依赖于语言环境的 知道如何在不使用的情况下将字符串转换为数字tonumber 谢谢 例如将字符串 58 5 转换为 58 5 另外 当我尝试将带点的数字传递给函数时 该函数会转换
  • 比较 Lua 中的日期

    我有一个带有日期表的变量 如下所示 table day number 15 year number 2015 month number 2 如何获取当前日期与上述日期之间的天数 非常感谢 您可以使用os time 将表转换为秒并获取当前时间
  • 如何在lua中获取shell脚本的返回码?

    我正在lua中执行一个脚本 os execute sh manager scripts update system sh f 我想获得脚本的输出 如果退出状态为 7 则返回 7 I tried local output os execute
  • 表长度运算符的性能

    卢阿有 运算符来计算用作数组的表的 长度 在诸如 C 之类的语言中 计算出某个内容的长度后 通常不会再次计算它 例如int len strlen string 这在 Lua 中有什么不同吗 其中一个的效率是否比另一个低 显然这可能不会显示显
  • 从命令行运行 vlc 扩展

    我有一个用 Lua 编写的 vlc 扩展 我知道如何从 GUI 运行它 查看 gt 我的扩展 我想从命令行运行它 这样我就不需要每次都启动X 它还没有实施 查看门票 3883 https trac videolan org vlc tick

随机推荐

  • php实例——用户注册与登录

    这周做了个php的简单实例 算是学了这么久php语法的一次综合应用吧 感觉前面学的东西都不知道怎么用 不看教程还真做不出来 本来想把它写在网页弹出层上的 这样看起来更像是一个用户登录框 但是看了弹出层的代码后发现太麻烦了 所有的登录框代码都
  • Ubuntu安装Nvidia Container Toolkit

    文章目录 前言 一 基本概念 二 操作步骤 1 添加源 2 安装重启 总结 前言 NVIDIA Container Toolkit 可用于各种 Linux 发行版并支持不同的容器引擎 在开始之前 请确保您已经为您的 Linux 发行版安装了
  • 【微信小程序】 tabs切换时自动定位到点击的元素

    重点是设置 scroll into view 值为点击时元素的ID id不能以数字开头
  • 使用 MVC 架构构建 Flask CRUD 应用程序

    转自 Felipe Silveira 的 Build a Flask CRUD Application with MVC Architecture 翻译 如何用 Flask 的 Blueprint 实现一个 CRUD 的应用 我多年来一直在
  • 项目前端技术总结

    设计目标 在前端的设计阶段引入prototype prototype用于允许用户评估开发人员提案 并在实施之前尝试它们 它还有助于了解用户特定的要求 并且可能在开发商在产品设计期间可能没有考虑到这些要求 在数据处理之前需要用户填写表单或浏览
  • C#中的三种参数传递

    在 C 中 有三种向方法传递参数的方式 1 值参数 调用方法时 会为每个值参数创建一个新的存储位置 复制参数的实际值给函数的形参 按值传递 传递实参变量存储的内容 作用 传递信息 2 引用参数 引用参数是一个对变量的内存位置的引用 复制参数
  • 自己制作npy数据集,数据格式类似于mnist数据(16)---《深度学习》

    代码 import tensorflow as tf import numpy as np import os from PIL import Image dir home jobs Pictures test def getFileArr
  • GPT和GPT2

    https blog csdn net weixin 48185819 article details 106533850 https zhuanlan zhihu com p 174782647 https wmathor com ind
  • Flutter 隐藏组件的多种方法

    链接 https blog csdn net haha223545 article details 102796137
  • VUE 本地和内网(远程)访问配置

    本机电脑由于开启Hyper V 所以默认得到的内网是虚拟网卡的IP 所以需要特殊的方法来得到内网IP 一 package json 原代码 scripts dev webpack dev server inline progress con
  • java用Swing编写简单计算器

    先写个用来处理计算的类Calculate import java util public class Calculate public static Stack
  • 二叉堆

    二叉堆 在学习二叉堆之前 我们得理解堆是什么 定义 堆通常可以看作成一个树 它有任意节点的值都不大于 不小于 其子节点的值 二叉堆的意思就是 它有两个子节点 可分为最大堆和最小堆 最大堆 父节点的值总是大于或等于任何一个子节点的值 最小堆
  • Fourth season fifteenth episode,is Ross man enough to play rugby?

    Scene A beauty parlour Rachel is getting a manicure while Chandler yes Chandler is getting a petticure Does that scare y
  • org.springframework.beans.factory.BeanCreationExce

    org springframework beans factory BeanCreationException Error creating bean with name u Injection of resource methods fa
  • 代码审查总结

    近期所带项目 由于人员素养良莠不齐 写出的代码质量不一 为了保证项目质量 不得不正确代码一行行进行审查 同一时候 为了对代码审查有个更深的了解及借鉴其他同行实践成果 在网上搜集了不少项目知识 以下是对这些知识做出的整理 第1章前提 在 Wi
  • urllib库的使用

    个人简介 作者简介 大家好 我是W chuanqi 一个编程爱好者 个人主页 W chaunqi 支持我 点赞 收藏 留言 愿你我共勉 若身在泥潭 心也在泥潭 则满眼望去均是泥潭 若身在泥潭 而心系鲲鹏 则能见九万里天地 文章目录 urll
  • caffe源码学习中--src/caffe/solver.cpp

    include caffe solver factory hpp中的solverRegistry类和SolverRegisterer 类 brief A solver factory that allows one to register
  • Unity屏幕坐标(Input.mousePosition)转换UI坐标

    Unity屏幕坐标 Input mousePosition 转换UI坐标 1 屏幕坐标的起点位置 左下角为 0 0 点 右上角为 Screen width Screen height 2 UI坐标的起点位置 屏幕中心点 方法一 Vector
  • linux下svn服务器搭建及使用(包含图解)

    今天自己动手在linux搭建了svn服务器 把具体过程和一些自己的见解分享给大家 希望对大家有所帮助 客户端svn 大家见到的小乌龟 下载地址为 http tortoisesvn net downloads html 这里客户端的安装就不作
  • Lua使用指南

    目录 简介 环境配置 基本语法 变量 运算符 数据类型 字符串 table 表 函数 常用语句 if while 循环 repeat until for循环 简介 lua 是一种开源 轻量的脚本语言 其设计目的是嵌入应用程序中 为应用程序提