Lua入门使用与基础语法

文章目录

  • 目的
  • 基础说明
  • 开发环境
  • 基础语法
    • 注释
    • 数据类型
    • 变量
    • 流程控制
    • 函数
  • 总结

目的

Lua是一种非常小巧的脚本语言,基于C构建并且完全开源,可以方便的嵌入到各种项目中,当然也可以单独使用。Lua经常被用在很多非脚本语言的项目中,用来扩展脚本功能,提供一定的灵活性。最常见的应用场景就是各类游戏中(比如魔兽世界和愤怒的小鸟)。这篇文章将对相关内容做个入门介绍。

官网:https://www.lua.org/
在这里插入图片描述

基础说明

Lua is a powerful, efficient, lightweight, embeddable scripting language. It supports procedural programming, object-oriented programming, functional programming, data-driven programming, and data description.
Lua是一种强大、高效、轻量级、可嵌入的脚本语言。它支持程序化编程、面向对象编程、函数式编程、数据驱动编程和数据描述。

Lua is dynamically typed, runs by interpreting bytecode with a register-based virtual machine, and has automatic memory management with a generational garbage collection, making it ideal for configuration, scripting, and rapid prototyping.
Lua 是动态类型的, 通过使用基于寄存器的解释字节码来运行虚拟机,并具有自动内存管理和垃圾收集, 使其成为配置、脚本编写、 和快速原型制作。

As an extension language, Lua has no notion of a “main” program: it works embedded in a host client, called the embedding program or simply the host. The host program can invoke functions to execute a piece of Lua code, can write and read Lua variables, and can register C functions to be called by Lua code. Through the use of C functions, Lua can be augmented to cope with a wide range of different domains, thus creating customized programming languages sharing a syntactical framework.
作为一种扩展语言,Lua没有“主”程序的概念: 它嵌入在主机客户端中工作, 称为嵌入程序或简称为主机。 宿主程序可以调用函数来执行一段 Lua 代码, 可以写入和读取Lua变量, 并且可以注册要由Lua代码调用的C函数。 通过使用 C 函数,Lua 可以增强以应对 广泛的不同领域, 从而创建共享语法框架的自定义编程语言。

Lua语法相关的使用手册可以在下面链接中获得:
https://www.lua.org/manual/

开发环境

可以直接在线体验Lua:
http://www.lua.org/demo.html

也可以下载对应的编译好的Lua解释器来使用:
https://luabinaries.sourceforge.net/

当然官方推荐可以使用下面这个IDE(ZeroBrane Studio):
https://studio.zerobrane.com/
在这里插入图片描述
目前版本该软件设置中文和解释器版本方式如下:
在这里插入图片描述
在这里插入图片描述

现在来说也可以使用VS Code加扩展的方式来使用,在这里就先不介绍了。

基础语法

注释

-- 双横线及后面的内容是单行注释--[[ 这是多行注释
这是多行注释 ]]--[=[ 这也是多行注释
这也是多行注释 ]=]-- 在ZeroBrane Studio中注释中使用 [text](url) 方式将成为一个超链接

数据类型

Lua是动态类型语言,变量声明时无需指定类型,类型会在赋值时自动确定。

Lua中有8中基本类型:

数据类型描述
nil只有值 nil 属于该类,表示缺少有用的值(在条件表达式中相当于 false
boolean包含 falsetrue(只有 falsenil 表示假,其它值都为真,0 和空字符串也为真 )
number包含整形和浮点型,默认浮点型为双精度的
可以通过自行编译解释器时 file luaconf.h 文件中的 LUA_32BITS 来设置为单精度模式
string字符串
function由 C 或 Lua 编写的函数
userdata表示任意存储在变量中的C数据结构
thread协程
table表,可以用来表示普通数组、列表、符号表、集合、记录、图形、树等

下面代码可以直接测试相关内容:

--[[ 以下是nil类型相关测试 ]]print(type(nil))--[[ 以下是boolean类型相关测试 ]]print(type(true))
print(type(false))if nil thenprint("nil 为 true")
elseprint("nil 为 false")
endif NaN then -- NaN用于表示未定义的运算结果,如0/0print("NaN 为 true")
elseprint("NaN 为 false")
endif 0 thenprint("数字 0 为 true")
elseprint("数字 0 为 false")
endif '' thenprint("空字符串 为 true")
elseprint("空字符串 为 false")
end--[[ 以下是number类型相关测试 ]]print(type(2))
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))--[[ 以下是string类型相关测试 ]]str1 = "This is str1." -- 声明变量,字符串写法1
str2 = 'This is str2.' -- 声明变量,字符串写法2
str3 = [[
This is str3.
]] -- 声明变量,字符串写法3print(str1)
print(str2)
print(str3)print("2" + 6) -- 数字类型字符串算术运算时认为会当作数字
print("2" + "6") -- 数字类型字符串算术运算时认为会当作数字
print("2 + 6") -- 这是一个单纯的字符串
-- print("error" + 1) -- 这会报错
print("error" .. 1) -- 使用 .. 拼接字符串
print("Hello" .. " " .. "Naisu" .. "!") -- 使用 .. 拼接字符串
print(#"naisu") -- 使用 # 计算字符串长度
print(#str1) -- 使用 # 计算字符串长度--[[ 以下是table类型相关测试 ]]
-- Lua中的table是一个关联数组(associative arrays)
-- 可以当作常见的数组使用,也可以当作键值对使用,或者也可以混合使用
-- 当作键值对使用时,键可以是除nil和NaN外的任意值,值可以是除nil外的任意值tbl1 = {} -- 创建一个空表
tbl2 = {"apple", "pear", "orange", "grape"} -- 创建一个带初值的数组类型的表
tbl3 = { c1=1, c2=2, c3=3 } -- 创建一个带初值的键值对类型的表for key, val in pairs(tbl2) doprint(key .. " : " .. val) -- 遍历输出表中元素,数组形式会顺序输出
endfor key, val in pairs(tbl3) doprint(key .. " : " .. val) -- 遍历输出表中元素,键值对形式并不一定按照顺序输出
endprint(tbl2[-1]) -- 默认索引是从1开始的,但可以手动添加负索引元素
print(tbl2[0]) -- Lua的索引并非从0开始,而是从1开始 !!!
print(tbl2[1]) 
print(tbl2[4])tbl2[5] = 233 -- 直接添加新元素
print(#tbl2) -- 计算数组长度,如果元素中有值是nil该方式使用时需要当心
print(tbl2[5])print(tbl3["c1"]) -- 键值对通过键名获取元素
print(tbl3.c1) -- 键值对也可以通过这种方式获取元素
tbl3["c4"] = 233
tbl3.c5 = 777
print(tbl3.c4)
print(tbl3.c5)

变量

下面代码可以直接测试相关内容:

var1 = 777 -- 全局变量function func1()var2 = 233 -- 全局变量local var3 = "naisu" -- local修饰的是局部变量return var2, var3
endfunc1() -- 运行函数print(var1, var2, var3) -- var3在这里不存在,会打印为nila, b = 22, 33 -- 可以同时对多个变量赋值
print(a, b)a, b = b, a -- 利用这个特性可以方便的交换两个元素
print(a, b)a, b = func1() -- 或者接收函数的多个返回值
print(a, b)c, d = 0 -- 需要注意的是多个变量需要分别赋值
print(c, d)-- Lua 5.2 及其之后所有的全局变量等都是挂在 _ENV 这个表中的-- Lua 5.2 之前是相似的表是 _G,不过新版本也做了兼容 _ENV[‘_G’]=_ENVprint(_ENV.var1)function func2()local _ENV={print = print, abb = "robot"} -- 函数内部自己的全局环境print(_ENV.abb)
endfunc2()-- Lua 5.4中新增的常量定义
local var <const> = "value" -- 必须在声明时赋值,之后无法修改--[[
算数运算符
+: 加
-: 减
*: 乘
/: 除
//: 整除
%: 取余
^: 幂乘
-: 符号
]]--[[
位运算符
&: 按位与
|: 按位或
~: 按位异或(两个值时);按位取反(一个值时)
>>: 右移
<<: 左移
]]

流程控制

下面代码可以直接测试相关内容:

var1 = 10-- Lua中 do ... end 之间是一个代码块
dolocal var1 = 666print(var1)
endprint(var1)-- while演示
print("while:")while var1 < 13 do var1 = var1 + 1print(var1)
end-- repeat
print("repeat:")repeatvar1 = var1 + 1print(var1) 
until var1 > 15-- if
print("if:")if 0 thenprint("Lua中数值 0 为 true")
endif nil thenprint("nil is true" )
elseprint("nil is false" )
endif nil thenprint("nil is true" )
elseif false thenprint("false is false")
elseprint("both nil and false is false" )
end-- for
print("for:")for i = 0, 2 do -- i从0到2,每次以步进1递增print(i)      -- 注意会打印2
endfor i = 10, 1, -3 do -- i从10到1,每次以步进-3递增print(i)
endtbl1 = {22, 33, x=666, y=777, 888 }print("for pairs:")
for k, v in pairs(tbl1) do -- pairs适合用来遍历键值对print(k, v)              -- 注意输出是乱序的
endprint("for ipairs:")
for i, v in ipairs(tbl1) do -- ipairs适合用来遍历数组print(i, v)
end-- break
print("break:")for i = 0, 5 doprint(i)      if i > 1 thenbreakend
end-- goto
print("goto:")for i=1, 3 doif i <= 2 thengoto continue -- 调至标签endprint("no goto")::continue:: -- 标签两边用::print(i)
end--[[
关系运算符
==: 等于
~=: 不等于
<:  小于
>:  大于
<=: 小于等于
>=: 大于等于
]]--[[
逻辑运算符
and: 逻辑与
or:  逻辑或
not: 逻辑非
]]

函数

下面代码可以直接测试相关内容:

function func1() -- 无参数无返回值函数-- 语句
endfunction func2(arg1, arg2) -- 带参数无返回值函数-- 语句
endfunction func2() -- 无参数,带多个返回值的函数return 22, 33
endfunc3 = function() -- 匿名函数直接赋值给变量-- 语句
endfunction func4() -- 闭包local i = 0return function()i = i + 1print(i)end
endf1 = func4()
f1()
f1()f2 = func4()
f2()
f2()  function func5(...) -- 带可变参数的函数local arg={...} -- 接收可变参数为表for i,v in ipairs(arg) doprint(i, v)end
endfunc5("naisu", 233, 666)local function func6() -- 本地函数-- 语句
end

总结

Lua的入门使用和基础语法本身还是挺简单的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/120419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式—创建型模式之单例模式

设计模式—创建型模式之单例模式 介绍 单例模式说明&#xff1a;一个单一的类&#xff0c;负责创建自己的对象&#xff0c;同时确保系统中只有单个对象被创建。 单例模式特点&#xff1a; 某个类只能有一个实例&#xff1b;&#xff08;构造器私有&#xff09;它必须自行创…

Redis 主从

目录 ​编辑一、构建主从架构 1、集群结构 2、准备实例和配置 &#xff08;1&#xff09;创建目录 &#xff08;2&#xff09;修改原始配置 &#xff08;3&#xff09;拷贝配置文件到每个实例目录 &#xff08;4&#xff09;修改每个实例的端口&#xff0c;工作目录 &a…

虹科分享 | 买车无忧?AR带来全新体验!

文章来源&#xff1a;虹科数字化与AR 阅读原文&#xff1a;https://mp.weixin.qq.com/s/XsUFCTsiI4bkEMBHcGUT7w 新能源汽车的蓬勃发展&#xff0c;推动着汽车行业加速进行数字化变革。据数据显示&#xff0c;全球新能源汽车销售额持续上升&#xff0c;预计到2025年&#xff0…

MySQL初始化之后启动报错(mysqld: Table ‘mysql.plugin‘ doesn‘t exist)

报错场景 初始化之后&#xff0c;服务无法启动。错误日志error-log 报错如下&#xff1a;&#xff08;mysql库下的系统表不存在&#xff09; 2023-10-26T06:03:08.150163-00:00 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2023-10-26T06:03:08.496…

javascript原生态xhr上传多个图片,可预览和修改上传图片为固定尺寸比例,防恶意代码,加后端php处理图片

//前端上传文件 <!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml" lang"UTF-8"></html> <html><head><meta http-equiv"Content-Type" content"text/html;charsetUTF-8;"/><title…

关于前端如何下载后端接口返回content-type为application/octet-stream的文件

关于前端如何下载后端接口返回response-type为application/octet-stream的文件 问题描述 后端接口定义为直接返回一个文件&#xff0c;如果带认证信息可以直接通过浏览器url下载&#xff0c;但是接口需要传headers认证信息&#xff0c;url上又不支持传相关信息 解决 前端…

p5.js map映射

本文简介 带尬猴&#xff0c;我嗨德育处主任 p5.js 为开发者提供了很多有用的方法&#xff0c;这些方法实现起来可能不难&#xff0c;但却非常实用&#xff0c;能大大减少我们的开发时间。 本文将通过举例说明的方式来讲解 映射 map() 方法。 什么是映射 从 p5.js 文档 中可…

N-129基于springboot,vue学生宿舍管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vuevue-element-admin 服务端技术&#xff1a;springboot,mybatis…

Redis 主从复制和哨兵监控,实现Redis高可用配置

文章目录 一、概述二、主从复制模拟说明三、准备配置文件四、启动Redis实例五、主从复制配置5.1 命令方式启用和取消主从复制5.2 配置文件方式启用和取消主从复制5.3 测试主从复制5.4 有其主从复制的其他参数配置 六、Sentinel 配置6.1 Sentinel 的作用6.2 Sentinel 监控说明6.…

关于网络安全运营工作与安全建设工作的一些思考

以下内容是个人成长过程中对于网络安全运营工作的理解和思考&#xff0c;希望通过这篇文章帮助大家更好的去做安全运营体系化建设&#xff0c;开始吧&#xff01; 文章目录 一、网络安全运营是什么&#xff1f;二、网络安全运营建设阶段第一阶段&#xff1a;设备限制阶段第二阶…

基于springboot实现校园交友网站管理系统项目【项目源码+论文说明】

基于springboot实现校园交友网站管理系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生…

iStat Menus v6.72

iStat Menus是一款Mac电脑上的系统监控工具&#xff0c;它可以帮助用户监测电脑的硬件和软件状况&#xff0c;提供实时的系统数据和统计信息。 其主要特点包括&#xff1a; 1.系统监测&#xff1a;iStat Menus可以监测CPU、内存、硬盘、网络、电池等系统参数&#xff0c;方便…

性能测试基本知识

性能测试基本知识 一、什么是性能测试 使用自动化工具&#xff0c;模拟不同的场景&#xff0c;对软件各项性能指标进行测试和评估的过程就是性能测试。 1. 后台处理程序的性能&#xff08;代码性能&#xff09; 2. 中间件、数据库、架构设计等是否存在瓶颈 3. 服务器资源消耗…

java springboot2.7 写一个本地 pdf 预览的接口

依赖方面 创建的是 接口web项目就好了 然后包管理工具打开需要这些 import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; imp…

macOS Sonoma 14.1正式版发布 改善Apple Music界面 新增保修状态显示

10月26日消息&#xff0c;苹果今天为 macOS Sonoma 推出了 14.1 版本更新&#xff0c;本更新主要改善了 Apple Music 界面&#xff0c;设置中新增保修状态&#xff0c;并修复了多项错误内容。 经过几周的用户测试&#xff0c;Apple 正式向所有 Mac 用户发布了 macOS Sonoma 14.…

以“降本增效”为目标,智能视频监控能为企业带来哪些经济价值?

随着经济的发展和科技的进步&#xff0c;企业需要不断提升自身的品质和效率&#xff0c;以保持竞争优势。而智能视频监控技术正是一项值得考虑的工具&#xff0c;其对企业带来的降本增效效益可以通过以下几个方面来体现。 1、降低运行成本 EasyCVR智能视频监控平台可以实现远程…

ArcGIS中如何为跨带数据投影?

北京54、西安80高斯克吕格投影是我国常用的投影坐标系统,它们是一种分带投影方式,有3和6分带,不适合大范围内的投影使用。但是如果有份数据范围较大,跨越了多个度带,该选择哪个坐标系统进行投影转换呢? 在大范围内,常用的坐标系统有Albers等面积投影和Lambert等角投影,…

实现基于 Jenkins 的多服务器打包方案

实现基于 Jenkins 的多服务器打包方案 在实际项目中&#xff0c;我们经常会遇到需要将一个应用程序或服务部署到不同的服务器上的需求。而使用 Jenkins 可以很方便地自动化这个过程。 设置参数 首先&#xff0c;我们需要设置一些参数&#xff0c;以便在构建过程中指定要部署…

什么是云原生?土生土长?

“云原生”&#xff08;Cloud Native&#xff09;是一种构建和运行应用程序的方法&#xff0c;这种方法充分利用了云计算的优势。云原生应用程序是为云环境设计的&#xff0c;通常是在容器中运行&#xff0c;并被设计为在微服务架构中运行&#xff0c;这使得它们能够快速扩展和…