当前位置: 首页 > news >正文

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的入门使用和基础语法本身还是挺简单的。

相关文章:

Lua入门使用与基础语法

文章目录 目的基础说明开发环境基础语法注释数据类型变量流程控制函数 总结 目的 Lua是一种非常小巧的脚本语言&#xff0c;基于C构建并且完全开源&#xff0c;可以方便的嵌入到各种项目中&#xff0c;当然也可以单独使用。Lua经常被用在很多非脚本语言的项目中&#xff0c;用…...

RDMA概览

RDMA(Remote Direct Memory Access&#xff0c;远程直接内存访问)&#xff0c;指能够访问(读写)远程机器的内存。有多种支持RDMA的网络协议&#xff0c;包括&#xff1a;Infiniband、RoCE和iWAPP。具体的API定义包含在内核文件linux/include/rdma/ib_verbs.h reference: 【精选…...

设计模式(15)组合模式

一、介绍&#xff1a; 1、定义&#xff1a;组合多个对象形成树形结构以表示“整体-部分”的关系的层次结构。组合模式对叶子节点和容器节点的处理具有一致性&#xff0c;又称为整体-部分模式。 2、优缺点&#xff1a; 优点&#xff1a; &#xff08;1&#xff09;高层模块调…...

小黑子—spring:第一章

spring入门1.0 一 小黑子对spring基础进行概述1.1 spring导论1.2 传统Javaweb开发困惑及解决方法1.3 三大的思想提出1.3.1 IOC入门案例1.3.2 DI入门案例 1.4 框架概念1.5 初识spring1.5.1 Spring Framework 1.6 BeanFactory快速入门1.7 ApplicationContext快速入门1.8 BeanFact…...

【面向对象】理解面向对象编程中的封装性

封装性是面向对象编程中的重要概念之一&#xff0c;它允许开发者将数据和方法组合成一个独立的单元&#xff0c;并通过定义访问权限来控制对这个单元的访问。本文将深入探讨面向对象编程中的封装性&#xff0c;包括封装的概念、实现封装的方式以及封装的好处。通过详细的解释和…...

ES修改字段类型详解

一、需求概述 ES修改字段类型是指在已有的索引中&#xff0c;通过特定的操作方式将某个字段的类型修改为其它类型。当ES在建立索引的时候&#xff0c;已经确定好了每个字段的类型&#xff0c;而如果在建立后发现类型不符需求&#xff0c;就需要修改字段类型。 二、修改字段类…...

C++基础:函数模板

为了代码重用&#xff0c;代码必须是通用的&#xff1b;通用的代码就必须不受数据类型的限制。那么我们可以把数据类型改为一个设计参数&#xff0c;这种类型的程序设计称为参数化程序设计&#xff0c;软件模板有模板构造&#xff0c;包括函数模板和类模板。 函数模板可以用来…...

Facebook账号被封?那是因为没做对这些事

Facebook是全球最大的社交媒体平台之一&#xff0c;拥有数十亿的全球用户。它的主要产品包括Facebook&#xff08;面向个人用户的社交媒体平台&#xff09;、Instagram、WhatsApp和Messenger。同时他也是美国数字广告市场的主要参与者之一&#xff0c;其广告平台吸引了数百万广…...

虚拟机kafka

一、kafka安装 &#xff08;1&#xff09;解压 &#xff08;2&#xff09;修改名字为kafka212 &#xff08;3&#xff09;进入/opt/soft/kafka212/config目录&#xff0c;配置文件server.properties 21 broker.id0 36 advertised.listenersPLAINTEXT://192.168.91.11:9092 …...

软考 系统架构设计师系列知识点之设计模式(3)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之设计模式&#xff08;2&#xff09; 所属章节&#xff1a; 老版&#xff08;第一版&#xff09;教材 第7章. 设计模式 第2节. 设计模式实例 2. 结构型模式 结构型模式控制了应用程序较大部分之间的关系。它将以不同…...

217. 存在重复元素、Leetcode的Python实现

博客主页&#xff1a;&#x1f3c6;看看是李XX还是李歘歘 &#x1f3c6; &#x1f33a;每天分享一些包括但不限于计算机基础、算法等相关的知识点&#x1f33a; &#x1f497;点关注不迷路&#xff0c;总有一些&#x1f4d6;知识点&#x1f4d6;是你想要的&#x1f497; ⛽️今…...

49.Redis缓存设计与性能优化

缓存与数据库双写不一致小概率事件 //线程1 写数据库stock 5 ---------------》更新缓存 //线程2 写数据库stock 4 -----》更新缓存 //线程1 ------》写数据库stock 10 -----》删除缓存 //线程2 ---------------------------------------------------------------------…...

IDEA常用的一些插件

1、CodeGlance 代码迷你缩放图插件&#xff0c;可以快速拖动代码&#xff0c;和VScode一样 2、Codota 代码提示工具&#xff0c;扫描你的代码后&#xff0c;根据你的敲击完美提示。 Codota基于数百万个开源Java程序和您的上下文来完成代码行&#xff0c;从而帮助您以更少的…...

基于定容积法标准容器容积标定中的电动针阀自动化解决方案

摘要&#xff1a;在目前的六氟化硫气体精密计量中普遍采用重量法和定容法两种技术&#xff0c;本文分析了重量法中存在的问题以及定容法的优势&#xff0c;同时也指出定容法在实际应用中还存在自动化水平较低的问题。为了提高定容法精密计量过程中的自动化水平&#xff0c;本文…...

26 行为型模式-命令模式

1 命令模式介绍 2 命令模式原理 3 命令模式实现 模拟酒店后厨的出餐流程,来对命令模式进行一个演示,命令模式角色的角色与案例中角色的对应关系如下: 服务员: 即调用者角色,由她来发起命令. 厨师: 接收者,真正执行命令的对象. 订单: 命令中包含订单 /*** 订单类**/ public cl…...

一个Entity Framework Core的性能优化案例

概要 本文提供一个EF Core的优化案例&#xff0c;主要介绍一些EF Core常用的优化方法&#xff0c;以及在优化过程中&#xff0c;出现性能反复的时候的解决方法&#xff0c;并澄清一些对优化概念的误解&#xff0c;例如AsNoTracking并不包治百病。 本文使用的是Dotnet 6.0和EF…...

【Python 千题 —— 基础篇】列表排序

题目描述 题目描述 给定一个包含无序数字的列表&#xff0c;请将列表中的数字按从小到大的顺序排列&#xff0c;并输出排序后的列表。 输入描述 输入一个包含无序数字的列表。 输出描述 程序将对列表中的数字进行排序&#xff0c;并输出排序后的列表。 示例 示例 ① 1…...

leetcode26:删除有序数组中的重复项

leetcode26&#xff1a;删除有序数组中的重复项 方案一&#xff1a;依次遍历&#xff0c;如果不符合条件则冒泡交换到最后一个位置。o(n^2),结果超时 #include <algorithm> #include <iostream>using namespace std; class Solution { public:int removeDuplicat…...

[FSCTF 2023] web题解

文章目录 源码&#xff01;启动!webshell是啥捏细狗2.0ez_php1Hello,youEZ_eval巴巴托斯&#xff01; 源码&#xff01;启动! 打开题目&#xff0c;发现右键被禁了 直接ctrlu查看源码得到flag webshell是啥捏 源码 <?php highlight_file(__FILE__); $&#x1f600;&qu…...

linux查看内存的方式

1、显示内存状态:free -h  以合适的单位显示内存使用情况&#xff0c;最大为三位数&#xff0c;自动计算对应的单位值。单位有&#xff1a; B bytes K kilos M megas G gigas T teras $free -htotal used free shared buff/cache available Me…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...