美文网首页
Lua语法一文通

Lua语法一文通

作者: 熊爸天下_56c7 | 来源:发表于2021-02-26 11:33 被阅读0次

一. 安装Lua环境

下载 lua
http://joedf.ahkscript.org/LuaBuilds/

解压到适合的地方

然后添加环境变量
然后用 cmd检查下

lua -v

二. vscode作为编辑器

vscode为Lua脚本编辑工具,仅仅具有脚本代码编辑功能,没有编译功能;
Lua为解释性语言,在Luat开发方式下,开发调试过程如下:
1、使用vscode编写Lua脚本
2、使用Luatools烧录Lua脚本
3、使用Luatools输出脚本运行日志

安装Lua插件
安装Luat插件
安装code runner
或者安装 lua debug

三. 基本操作

Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。
Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用

我们可以将 Lua 程序代码保存到一个以 lua 结尾的文件,并执行,该模式称为脚本式编程

1. 注释

单行注释 : --

多行注释 : --[[内容]]

2. 换行符

Lua的多条语句之间并不强制要求任何分隔符,如C语言的分号(;),其中换行符也同样不能起到语句分隔的作用。

a = 1
b = a * 2

a = 1;
b = a * 2;

a = 1; b = a * 2;
a = 1  b = a * 2

3. nil 无效值

nil类型表示没有任何有效值,只要是没有声明的值,它就是nil

比如打印一个没有声明的值,便会输出nil

4.打印

print("hello world")

也可以用,隔开打印多个值

a = 1
b = "2a"
print(a,b,c)

5. 单双引号及[[ ]]

单双引号规则和python基本相同.

即为: 单引号和双引号都可以, 单引号中可以包含双引号, 双引号中也可以包含单引号

print('我说:"hello world"')
print("我说:'hello world'")

但值得注意的是lua可以用[[]]来表示字符串

6. 赋值

都是常规用法, 唯一的差别是Lua支持“多重赋值”。

n = 1
a, b = 10, 2*n

当左右值的数量不一致时,Lua会进行下面的设定:

变量个数 > 值的个数:按变量个数补足nil
变量个数 < 值的个数:多余的值会被忽略

7. 运算符

运算符 功能
+ 加法
- 减法
* 乘法
/ 除法
// 地板除
% 取余,求出除法的余数
^ 乘幂,计算次方
- 负号,取负值

8. 真假值

Lua中所有的值都可以作为条件。在Lua中只有当值是false和nil时才视为“假”,其它值均视为真,如
数字零和空字符串是真值,这一点和C语言是不同的

四. 数据类型

Lua中的值有8种类型:nil、boolean、number、string、userdata、function、thread和table。

1.nil型

Lua中特殊的类型,他只有一个值:nil,它的主要功能是由于区别其他任何值。一个全局变量没有被赋值以前默认值为nil;给全局变量负nil可以删除该变量。Lua将nil用于表示一种“无效值”的情况。

2. boolean型

false和true。

3. number型

表示实数。由于资源所限,如需使用浮点型数据,请使用文件名带有float的固件。

4. string型

string和其他对象一样,Lua自动进行内存分配和释放,一个string可以只包含一个字母也可以包含一本 书,Lua可以高效的处理长字符串,1M的string在Lua中是很常见的。可以使用单引号或者双引号把一串字符括起来表示字符串

Lua中的字符串是恒定不变的。String.sub函数以及Lua中其他的字符串操作函数都不会改变字符串的值,而是返回一个新的字符串。

5.table型

table是Lua中唯一的数据结构,其他语言所提供的数据结构,如:数组、矩阵、链表、队列等,Lua都是通过table来很好地实现。

Lua中table的键(key)可以为任意类型(nil除外)。当通过整数下标访问table中元素时,即是数组。此外,table没有固定的大小,可以动态的添加任意数量的元素到一个table中

6. function型

函数是第一类值,意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值。这个特性给了语言很大的灵活性

7. userdata型

userdata可以将C数据存放在Lua变量中,userdata在Lua中除了赋值和相等比较外没有预定义的操作, userdata用来描述应用程序或者使用C实现的库创建的新类型。

五. 变量和值

  • Lua是动态类型语言,声明变量的时候不要类型定义
  • type函数获得变量的或值的类型信息
  • Lua变量分为: 全局变量、局部变量、表中的域。
  • Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。

1. 全局变量

  • 全局变量不需要声明,给一个变量赋值后即创建了这个全局变量
  • 访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil
  • 如果你想删除一个全局变量,只需要将变量赋值为nil

2. 局部变量

  • 局部变量必须通过local 来声明。

六. 运算符

1. 算术运算符

要注意, lua 的除法是自然除法, 如果用地板除,需要使用//

2. 关系运算符

Lua支持的关系操作符有:>、<、>=、<=、==、~=(不等于)。

注意:

  • ==和~=这两个操作符可以应用于两个任意类型的值。如果两个值的类型不同,Lua就认为他们不等。
  • nil值与其自身相等。
  • tables、userdata、functions是通过引用进行比较的。也就是说,只有当他们引用同一个对象时,才视为相等。
  • Lua比较字符串按字母的顺序进行,但是字母顺序依赖于本地环境。

3. 逻辑运算符

共有3个: and or not

七. 逻辑控制

1. if语句

if 语句有3种结构:

if condition then
    statements
end

if condition then
    statements
else
    statements
end

if condition1 then
    statements
elseif condition2 then
    statements
…                                   -- 很多个elseif
    statements
end

2. while语句

while condition do
    statements
end

3. repeat...until 循环 //(相当于其他语言的do...while)

repeat
   statements
until( condition )

4. for循环

数值for循环

for var=form,to,step do  
    <执行体>  
end  

step 是可选的,如果不指定,默认为1


泛型for循环

--打印数组a的所有值  
a = {"one", "two", "three"}
for i, v in ipairs(a) do
    print(i, v)
end 

5. break 语句

break 语句插入在循环体中,用于退出当前循环或语句,并开始脚本执行紧接着的语句。

如果你使用循环嵌套,break语句将停止最内层循环的执行,并开始执行的外层的循环语句。

6. goto 语句

Lua 语言中的 goto 语句允许将控制流程无条件地转到被标记的语句处。

goto Label

Label 的格式为:

:: Label ::

八. 函数

语法:

function test(arg1,arg2,...)
    --...
end
  • Lua函数支持返回多个结果值
function foo0 () end                -- returns no results
function foo1 () return 'a' end         -- returns 1 result
function foo2 () return 'a','b' end -- returns 2 results

当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能多地返回多个值,不足补nil,超出舍去。

x,y = foo2()                        -- x='a', y='b'
x = foo2()                          -- x='a', 'b' is discarded
x,y,z = 10,foo2()                   -- x=10, y='a', z='b'
x,y = foo0()                        -- x=nil, y=nil
x,y = foo1()                        -- x='a', y=nil
x,y,z = foo2()                      -- x='a', y='b', z=nil

其他情况下,函数调用仅返回第一个值(如果没有返回值为nil)

x,y = foo2(), 20                    --  x='a', y=20
x,y = foo0(), 20, 30                --  x='nil', y=20, 30 is discarded
print(foo2(), 1)                    --> a 1
print(foo2() .. "x")                    --> ax
a = {foo0(), foo2(), 4}             -- a[1] = nil, a[2] = 'a', a[3] = 4
  • Lua函数可以接受可变数目的参数,在函数形参中用三点(...)表示函数有可变的参数。Lua将函数的可变参数放在一个叫arg的表中,除了参数以外,arg表中还有一个域n表示参数的个数。

九. 模块与包

模块类似于一个封装库,从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。

1. 创建模块

Lua 的模块是由变量、函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table 就行。以下为创建自定义模块 module.lua,文件代码格式如下:

-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}
 
-- 定义一个常量
module.constant = "这是一个常量"
 
-- 定义一个函数
function module.func1()
    io.write("这是一个公有函数!\n")
end
 
local function func2()
    print("这是一个私有函数!")
end
 
function module.func3()
    func2()
end
 
return module

由上可知,模块的结构就是一个 table 的结构,因此可以像操作调用 table 里的元素那样来操作调用模块里的常量或函数。

上面的 func2 声明为程序块的局部变量,即表示一个私有函数,因此是不能从外部访问模块里的这个私有函数,必须通过模块里的公有函数来调用.

2. 调用模块

Lua提供了一个名为require的函数用来加载模块。要加载一个模块,只需要简单地调用就可以了。

require("模块名")
-- 或者
require "模块名"
-- 或者起别名
local m = require("module")

3. 加载机制 //系统如何找到模块???

对于自定义的模块,模块文件不是放在哪个文件目录都行,函数 require 有它自己的文件路径加载策略,它会尝试从 Lua 文件或 C 程序库中加载模块。

require 用于搜索 Lua 文件的路径是存放在全局变量 package.path 中,当 Lua 启动后,会以环境变量 LUA_PATH 的值来初始这个环境变量。

相关文章

网友评论

      本文标题:Lua语法一文通

      本文链接:https://www.haomeiwen.com/subject/yokufltx.html