Lua实验室之Lua语法

本文介绍了Lua作为一种轻量级、高效且可扩展的嵌入式脚本语言,详细阐述了其设计目的、特点,以及包括注释、标识符、数据类型、变量、赋值、循环、分支控制、函数、运算符、匹配模式、线程、table、元表、协同程序等在内的基础语法。此外,还涉及了Lua的文件I/O、错误处理、调试、垃圾回收和面向对象编程等内容。
摘要由CSDN通过智能技术生成

前言

出于热更新的需要,越来越多的Unity游戏项目都采用了Lua做为热更脚本,先不说众多的lua热更解决方案,也不说lua与unity如何结合及最佳实践,本文先主要介绍一下Lua的语法及自身特点:

什么是Lua

借用Lua官网介绍的一句:Lua是一个强大的,高效的,轻量的嵌入式脚本语言。支持过程编程,面向对象编程,函数式编程,数据驱动编程和数据描述。

设计目的

其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

Lua的特点

  • 轻量级:它用标准C语言编写并以源代码的形式开放,编译后仅仅100多k,可以很方便的嵌入别的程序里。
  • 可扩展:Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
  • 其它特性:支持面向过程编程和函数式编程,自动内存管理,内置模式匹配,闭包,协同机制的多线程是,通过闭包和table可以很方便的支持面向对象编程所需要的一些关键机制。如数据抽象,虚函数,继承和重载等。

基本语法

注释

  • 单行注释:--
  • 多行注释:--[[xxxxx--]]

标识符

和大多数语言一样,区分大小写,字母,数字,下划线,不能有特殊字符

数据类型

  • nil:就是null值,在条件语句中相当于false
  • boolean:false和true
  • number:数字类型
  • string:字符串,用”“或”表示
  • function:用C或Lua编写的函数
  • userdata:任意存储在变量中的C数据结构
  • thread:线程,用于执行协同程序
  • table:本质上是一个关联数组,数组索引可以是数字或者是字符串。table的创建是通过“构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。
    可以使用type函数测试值的类型
print(type(nil)) --nil
print(type(false)) --boolean
print(type(10)) --number
print(type('')) --string
print(type(function() end)) -- function
print(type({}))--table
print(type(coroutine.create(function() end)))--thread

注意的地方:nil作比较时应该加上双引号”:

type(X) == nil --false
type(X) == "nil" --true

string字符串:由一对双引号或单引用来表示,也可以用2个方括号[[]]表示一块字符串,对一个数字字串进行算数操作时,会尝试转成数字,字符串连接使用..,#计算字符串长度

s = 'hello'
html=[[
<html><header></header><body></body></html>
]]
print('2'+6) -- 8
print('a'..'b') -- ab
print(#'hello') -- 5

table:默认初始索引从1开始

**thread:主要的线程是协同程序(coroutine).它跟线程(thread)差不多,拥有独立的栈,局部变量和指令指针,和其他协同程序共享全局变量和其他大部分东西。


线程和协程的区别:线程可以同时运行多个,而协程做任意时刻只能运行一个,并且处于运行状态的协程只有被挂起时才会暂停。


userdata可以将任意C/C++的任意数据类型的数据(通常是struct和指针)存储到Lua变量中调用

变量

Lua变量有三种类型:分别是全局变量,局部变量和表中的域
默认是全局变量,除非用local显示声明为局部变量

赋值

可以对多个变量同时赋值,会先计算右边所有的值再执行赋值操作

a='hello'
a,b=10,2*x
x,y=y,x

索引

对table的索引使用方括号[].Lua也提供了.操作

Lua循环

  • while:while(exp) do … end
  • for:for var=exp1,exp2,exp3 do … end for … in do end
  • repeat…until:repeat … until(exp)

分支控制

if(exp) then … elseif …else … end

Lua函数

[scope] function name(arg1,arg2,arg3…,argn)
body
return r1,r2
end
- 可以将函数作为参数传递给函数
- 可以将函数赋值给变量
- 可以返回多个值
- 可传递可变参数,使用三个点 … 表示
- 可将可变参数赋值给一个变量
- 可通过select(‘#’,…)获取可变参数的数量
- 可通过select(n,…)读取参数

Lua运算符

算术运算符

+-,*,/,%,^,-

关系运算符

==,~=(不等于),>,<,>=,<=

逻辑运算符

and,or,not

其它运算符

..(连接字符串),#(返回字符串或表的长度)

匹配模式

直接用常规的字符串描述

s = "Deadline is 12/12/2020,firm"
date="%d%d/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值