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 then
    print("nil 为 true")
else
    print("nil 为 false")
end

if NaN then -- NaN用于表示未定义的运算结果,如0/0
    print("NaN 为 true")
else
    print("NaN 为 false")
end

if 0 then
    print("数字 0 为 true")
else
    print("数字 0 为 false")
end

if '' then
    print("空字符串 为 true")
else
    print("空字符串 为 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.
]] -- 声明变量,字符串写法3

print(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) do
    print(key .. " : " .. val) -- 遍历输出表中元素,数组形式会顺序输出
end

for key, val in pairs(tbl3) do
    print(key .. " : " .. val) -- 遍历输出表中元素,键值对形式并不一定按照顺序输出
end

print(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
end

func1() -- 运行函数

print(var1, var2, var3) -- var3在这里不存在,会打印为nil

a, 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’]=_ENV
 
print(_ENV.var1)

function func2()
    local _ENV={print = print, abb = "robot"} -- 函数内部自己的全局环境
    print(_ENV.abb)
end

func2()

-- Lua 5.4中新增的常量定义
local var <const> = "value" -- 必须在声明时赋值,之后无法修改

--[[
算数运算符
+: 加
-: 减
*: 乘
/: 除
//: 整除
%: 取余
^: 幂乘
-: 符号
]]

--[[
位运算符
&: 按位与
|: 按位或
~: 按位异或(两个值时);按位取反(一个值时)
>>: 右移
<<: 左移
]]

流程控制

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

var1 = 10

-- Lua中 do ... end 之间是一个代码块
do
  local var1 = 666
  print(var1)
end

print(var1)


-- while演示
print("while:")

while var1 < 13 do 
  var1 = var1 + 1
  print(var1)
end


-- repeat
print("repeat:")

repeat
  var1 = var1 + 1
  print(var1) 
until var1 > 15


-- if
print("if:")

if 0 then
  print("Lua中数值 0 为 true")
end

if nil then
  print("nil is true" )
else
  print("nil is false" )
end

if nil then
  print("nil is true" )
elseif false then
  print("false is false")
else
  print("both nil and false is false" )
end


-- for
print("for:")

for i = 0, 2 do -- i从0到2,每次以步进1递增
  print(i)      -- 注意会打印2
end

for i = 10, 1, -3 do -- i从10到1,每次以步进-3递增
  print(i)
end


tbl1 = {22, 33, x=666, y=777, 888 }

print("for pairs:")
for k, v in pairs(tbl1) do -- pairs适合用来遍历键值对
  print(k, v)              -- 注意输出是乱序的
end

print("for ipairs:")
for i, v in ipairs(tbl1) do -- ipairs适合用来遍历数组
  print(i, v)
end


-- break
print("break:")

for i = 0, 5 do
  print(i)      
  if i > 1 then
    break
  end
end


-- goto
print("goto:")

for i=1, 3 do
    if i <= 2 then
        goto continue -- 调至标签
    end
    print("no goto")
    ::continue:: -- 标签两边用::
    print(i)
end


--[[
关系运算符
==: 等于
~=: 不等于
<:  小于
>:  大于
<=: 小于等于
>=: 大于等于
]]

--[[
逻辑运算符
and: 逻辑与
or:  逻辑或
not: 逻辑非
]]

函数

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

function func1() -- 无参数无返回值函数
  -- 语句
end

function func2(arg1, arg2) -- 带参数无返回值函数
  -- 语句
end

function func2() -- 无参数,带多个返回值的函数
  return 22, 33
end

func3 = function() -- 匿名函数直接赋值给变量
  -- 语句
end

function func4() -- 闭包
  local i = 0
  return function()
    i = i + 1
    print(i)
  end
end

f1 = func4()
f1()
f1()

f2 = func4()
f2()
f2()  

function func5(...) -- 带可变参数的函数
  local arg={...} -- 接收可变参数为表
  for i,v in ipairs(arg) do
    print(i, v)
  end
end

func5("naisu", 233, 666)

local function func6() -- 本地函数
  -- 语句
end

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

目标跟踪ZoomTrack: Target-aware Non-uniform Resizing for Efficient Visual Tracking

论文作者&#xff1a;Yutong Kou,Jin Gao,Bing Li,Gang Wang,Weiming Hu,Yizheng Wang,Liang Li 作者单位&#xff1a;CASIA; University of Chinese Academy of Sciences; ShanghaiTech University; Beijing Institute of Basic Medical Sciences; People AI, Inc 论文链接&…

【数据中台建设系列之二】数据中台-数据采集

​ 【数据中台建设系列之二】数据中台-数据采集 上篇文章介绍了数据中台的元数据管理&#xff0c;相信大家对元数据模块的设计和开发有了一定的了解&#xff0c;本编文章将介绍数据中台另一个重要的模块—数据采集。 一、什么是数据采集 数据采集简单来说就是从各种数据源中抓…

暄桐推荐|学书法的必读书目

在暄桐教室&#xff0c;写字之外&#xff0c;读书、静坐也是桐学们修习的功课。今天&#xff0c;便向你推荐&#xff0c;关于学习书法&#xff0c;暄桐教室的那些必读书目&#xff1a;    暄桐推荐学书法必读书之初阶书目&#xff1a;      对零基础的小白同学或刚入门…

FL Studio21最新中文汉化解锁版,2024怎么激活FL Studio

FL Studio2024最新中文汉化解锁版是一款功能强大的数字音频工作站&#xff08;DAW&#xff09;&#xff0c;它广泛应用于音乐创作和音乐制作领域。在使用FL Studio时&#xff0c;购买正版软件是否有必要呢&#xff1f;本文将详细探讨FL Studio的功能特点以及正版软件的重要性。…

防雷接地检测方法应用方案

防雷接地是指为了保护建筑物、设备和人员免受雷电危害而采取的将雷电电流导入地面的措施。 地凯科技防雷接地的测试方案一般包括以下几个方面&#xff1a; 测试目的&#xff1a;明确测试的对象、范围、要求和依据。 测试内容&#xff1a;根据不同类型的防雷接地装置&#xf…

【OpenCV实现图像的几何变换】

文章目录 概要&#xff1a;OpenCV实现图像的几何变换、图像阈值和平滑图像变换小结 概要&#xff1a;OpenCV实现图像的几何变换、图像阈值和平滑图像 使用OpenCV库进行图像处理的三个重要主题&#xff1a;几何变换、图像阈值处理以及图像平滑。在几何变换部分&#xff0c;详细…

threejs(4)-纹理材质高级操作

一、纹理重复_缩放_旋转_位移操作 // 导入threejs import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; // 导入lil.gui import { GUI } from "three/examples/jsm/l…

JavaScript进阶 第四天笔记——深浅拷贝、this绑定、防抖节流

JavaScript 进阶 - 第4天 深浅拷贝 浅拷贝 首先浅拷贝和深拷贝只针对引用类型 浅拷贝&#xff1a;拷贝的是地址 常见方法&#xff1a; 拷贝对象&#xff1a;Object.assgin() / 展开运算符 {…obj} 拷贝对象拷贝数组&#xff1a;Array.prototype.concat() 或者 […arr] 如…

软考系统架构师知识点集锦四:信息安全技术基础知识

一、考情分析 二、考点精讲 2.1信息加解密技术 2.1.1对称加密 概念:对称加密(又称为私人密钥加密/共享密钥加密) : 加密与解密使用同一密钥。特点:加密强度不高&#xff0c;但效率高;密钥分发困难。 (大量明文为了保证加密效率一般使用对称加密) 常见对称密钥加密算法:DES:…

Spring MVC 执行流程

前言 Spring MVC 是一个非常强大的框架&#xff0c;它能够帮助开发人员快速构建高效的 Web 应用程序。然而&#xff0c;要理解 Spring MVC 的执行流程并不容易&#xff0c;因为它涉及到多个组件和模块。在本文中&#xff0c;我们将介绍 Spring MVC 的执行流程&#xff0c;帮助…

【数据结构】数组和字符串(七):特殊矩阵的压缩存储:三元组表的转置、加法、乘法操作

文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表4.2.3三元组表的转置、加法、乘法、操作转置加法乘法算法测试实验结果代码整合 4.2.1 矩阵的数组表示 【数据结构】数组和字符串…

nginx浏览器缓存和上流缓存expires指令_nginx配置HTTPS

1.nginx控制浏览器缓存是针对于静态资源[js,css,图片等] 1.1 expires指令 location /static {alias/home/imooc;#设置浏览器缓存10s过期expires 10s;#设置浏览器缓存时间晚上22:30分过期expires @22h30m;#设置浏览器缓存1小时候过期expires -1h;#设置浏览器不缓存expires …

python+requests接口自动化测试框架

1、首先&#xff0c;我们先来理一下思路。 正常的接口测试流程是什么&#xff1f; 脑海里的反应是不是这样的&#xff1a; 确定测试接口的工具 —> 配置需要的接口参数 —> 进行测试 —> 检查测试结果&#xff08;有的需要数据库辅助&#xff09; —> 生成测试报…

新版yolov8添加注意力机制(以NAMAttention注意力机制为例)

1.引言 之前写过yolov8如何添加注意力机制&#xff0c;可以看此贴 【YOLOv8添加注意力机制(ShuffleAttention为例)】 但是最近yolov8的代码结构有了一些改动&#xff0c;因此&#xff0c;这里使用较新的代码重新写一篇 此外&#xff0c;不同的注意力机制添加方法基本相同&am…

SpringCloud Alibaba【一】简单介绍

SpringCloud学习笔记 SpringCloud-Alibaba Nacos学习笔记 SpringCloud-Alibaba Gateway学习笔记 其他组件的内容&#xff0c;会随着工作需要补充上去。 目录 SpringCloudSpringCloud Alibaba二者对比 SpringCloud 提起微服务&#xff0c;不得不提 Spring Cloud 全家桶系列&…

『第七章』翩翩起舞的雨燕:顺序与并发执行

在本篇博文中,您将学到如下内容: 1. 顺序执行2. 主线程 Main Thread 的秘密3. 并发执行:GCD 与分发队列(DispatchQueue)4. 延时执行5. 数据竞争(Data Race)6. 线程间的同步7. 避免线程爆炸8. RunLoop 与定时器总结楚客自相送,沾裳春水边。 晚来风信好,并发上江船。 花映…

无法查看 spring-boot-starter-parent的pom.xml

1. idea版本&#xff1a;2022.3 2. 使用Spring Initializr创建一个简单的spring-boot项目&#xff0c;发现无法查看 spring-boot-starter-parent的pom.xml ctrl鼠标左键 和 ctrl B 都无法进入 3. 解决&#xff1a;清除缓存重启&#xff08;&#x1f927;&#x1f630;&#…

一文解决:Swagger API 未授权访问漏洞问题

Swagger 是一个用于设计、构建、文档化和使用 RESTful 风格的 Web 服务的开源软件框架。它通过提供一个交互式文档页面&#xff0c;让开发者可以更方便地查看和测试 API 接口。然而&#xff0c;在一些情况下&#xff0c;未经授权的访问可能会导致安全漏洞。本文将介绍如何解决 …

机器学习——正则化

正则化 在机器学习学习中往往不知道需要不知道选取的特征个数&#xff0c;假如特征个数选取过少&#xff0c;容易造成欠拟合&#xff0c;特征个数选取过多&#xff0c;则容易造成过拟合。由此为了保证模型能够很好的拟合样本&#xff0c;同时为了不要出现过拟合现象&#xff0…

react-组件间的通讯

一、父传子 父组件在使用子组件时&#xff0c;提供要传递的数据子组件通过props接收数据 class Parent extends React.Component {render() {return (<div><div>我是父组件</div><Child name"张" age{16} /></div>)} }const Child …